2012-08-31 96 views
-1

優先基本上我需要合併兩個數組,其中值0將優先於1合併陣列,0比1

我找不到任何本地PHP函數來做到這一點,也沒有對谷歌的任何功能這令我感到吃驚(也許我一直在尋找錯誤的東西!),我無法想象如何有效地做到這一點。有什麼建議麼?

例如:

Array 1     Array 2 
    permission1 => 1   permission1 => 1 
    permission2 => 1   permission2 => 1 
    permission3 => 0   permission3 => 1 
    permission4 => 0   permission4 => 1 
           permission5 => 1 

所得陣列將是。

permission1 => 1 
permission2 => 1 
permission3 => 0 
permission4 => 0 
permission5 => 1 

正如你可能已經猜到這是一個權限系統。 Nothing表示沒有權限,0表示永遠不會,1表示擁有權限。我認爲最好的解決方案可能涉及將兩者加在一起,看看你是否得到1或2,但我想不出如何實現這一點。

我希望這個問題很清楚,只是要求澄清,如果沒有。預先感謝您的建議。

+1

自己動手做一個循環來迭代每個數組和比較值有問題嗎? –

+1

如果存在多個具有相同名稱的數組,則可以將它們相乘。 – RetroCoder

+0

@MarcB在對下面的答案發表評論時指出,我認爲它可能對大型陣列效率不高,並認爲可能有更好的解決方案。幾乎總是有一個更好的解決方案,我想到的東西:) RetroCoder哦,是的,這會比添加它們更容易,哎呀! –

回答

3
foreach($array2 as $key => $val) { 
    if (!isset($array1[$key])){ 
     $array1[$key] = $val; 
    } 
} 
+0

第二個數組中是否有零,這不起作用。它應該是'(!isset($ array1 [$ key])|| $ array1 [key] == 0)'。 – Krycke

+0

對於大型數組,這會很慢嗎?每個陣列可能有100個左右的權限。我想到了與此相似的東西(但是,這個簡潔不是我的強項!)。 –

+0

更新:我現在有這種解決方案,但我會嘗試@Krycke的解決方案發布爲一個單獨的答案,並對它們進行基準測試,以查看哪一個更有效。 –

0

如果先合併了兩下,然後retrive他們相交的,最後它用零和foreach循環他們設置爲零retrives只有一次,你應該得到正確的答案。這應該使你想循環的數組非常小。

$arr = array_merge($array1, $array2); 
$intersected = array_intersect_key($array1, $array2); 
$intersectWithZeroes = array_keys($intersected, 0); 
foreach($intersectWithZeroes as $key => $value) { 
    $arr[$key] = 0; 
} 
+0

我認爲這可能是我正在尋找的,因爲它只通過相交的循環而不是整個大型數組,因此可能更有效。我有一個使用@AlienWebguy的答案工作的解決方案,但是我會嘗試並將它們標記爲兩者並將結果發回此處以供參考。 –

+0

讓我知道。這個偏離的過程很大程度上取決於有多少相交值。 – Krycke

+0

事實上,請參閱基準測試的其他答案評論。對於我的應用程序來說,另一種解決方案在某種程度上更快。只有幾個相交點,我認爲這個解決方案肯定會更快。 –