2012-08-31 60 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

事实上,请参阅基准测试的其他答案评论。对于我的应用程序来说,另一种解决方案在某种程度上更快。只有几个相交点,我认为这个解决方案肯定会更快。 –