2017-10-08 76 views
2

有沒有辦法來布爾陣列組合:PHP結合陣列與邏輯運算符

$array1: ['prop1'=>T, 'prop2'=>F, 'prop3'=>T, 'prop4'=>F, 'prop5'=>T] 
$array2: ['prop1'=>T, 'prop2'=>F, 'prop3'=>F, 'prop4'=>T] 

進入

$array3: ['prop1'=>T, 'prop2'=>F, 'prop3'=>T, 'prop4'=>T, 'prop5'=>T] 

使用比較呢?

我以爲使用$array3 = $array1 | $array2會工作,但它會返回一個值。

我覺得這可能是重複的,但我沒有在SO上找到同樣的問題。

+0

你不能有兩個鍵名稱相同:'$ ARRAY3 [ '爲prop1']',猜測你的意思'prop3'? – Scuzzy

+0

你不能有重複的鍵,但我認爲*兩個數組中的'prop1'的第二個實例應該是'prop3'。如果是這樣,一個人如何「結合」他們,因爲他們有不同的價值觀?你是否試圖說**如果**數組包含相關鍵的「真」值,推送到第三個數組? –

+0

@Scuzzy看起來像一個錯別字設置他們的MVCE –

回答

0

雖然每個陣列具有相同的鍵就可以通過第一陣列檢查,請使用foreach循環循環,如果相等,那麼你設置的鍵和值導致數組否則,如果不相等則使用一個具有真正價值

$result=array(); 
foreach($array1 as $key=>$value){ 
    if($array1[$key]==$array2[$key] || $array2==undefined){ 
    $result[$key]=$value; 
    } 
    else{ 
    $result[$key]=($array1[$key]==True)?$array1[$key] : $array2[$key]; 
    } 
} 

然後依次通過第二陣列,以查看是否該鍵在第一未定義從第二陣列

foreach($array2 as $key=>$value){ 
    if ($array1[$key]==undefined){ 
    $result[$key]=$value; 
    } 
} 
0

這是我能想到的最短溶液添加密鑰值。而且它真的不那麼複雜:)。首先我們添加兩個數組以確保所有密鑰均存在於$result中。然後我們使用array_walk來執行邏輯操作。

我們需要3個參數。第一個是我們想要操縱的$result變量。 第三個參數傳遞給我們的回調函數。我們再次使用數組總和來確保所有密鑰都已設置,但此時$array2獲得優先權。

第二個是我們的回調。我們通過參考(&),每個關鍵值和我們的願望作爲第三個參數,從初步結果中獲得每個值。該函數本身非常簡單,我們只需將$v設置爲我們想要實現的任何操作即可。對於OR爲||,對於AND爲或對於XOR爲&&(但異或需要額外的括號,參見Operator precedence)。

Demo

$array1 = ['prop1'=>TRUE, 'prop2'=>FALSE, 'prop3'=>TRUE, 'prop4'=>TRUE]; 
$array2 = ['prop1'=>TRUE, 'prop2'=>TRUE, 'prop3'=>FALSE, 'prop5'=>FALSE]; 
$result = $array1 + $array2; 

array_walk($result, function(&$v, $k, $a){ 
    $v = $v || $a[$k]; //Here you can change the operation 
}, $array2+$array1); 

var_dump($result);