2013-10-24 73 views
1

我有两个我想要合并的数组,但省略了第二个数组中匹配值的元素。 (idotherId合并2个数组,将第二个数组的元素留在值匹配

我知道如何用第一个循环内的第二个循环来实现这一点,但我想知道是否可以使用单个循环或使用特定的PHP函数来实现?

这是什么,我现在在做一个例子:

foreach ($array1 as $item) 
{ 
    $id = $item['id']; 

    foreach ($array2 as $key => $item) 
    { 
     if ($item['otherId'] == $id) 
     { 
      unset($array2[$key]); 
     } 
    } 
} 

$output = array_merge($array1, $array2); 

会有很多在两个数组的元素,所以我在寻找这样做的最有效的方式。阵列

例子:

$array1 = [ 
    [ 
     'id' => 1 
     'name' => 'item 1' 
    ], 
    [ 
     'id' => 2 
     'name' => 'item 2' 
    ], 
    [ 
     'id' => 3 
     'name' => 'item 3' 
    ], 
    [ 
     'id' => 4 
     'name' => 'item 4' 
    ] 
]; 

$array2 = [ 
    [ 
     'id' => 1, 
     'otherId' => 2, 
     'name' => 'item 2' 
    ], 
    [ 
     'id' => 2, 
     'otherId' => 3, 
     'name' => 'item 3' 
    ], 
    [ 
     'id' => 3, 
     'otherId' => null, 
     'name' => 'item 4' 
    ], 
    [ 
     'id' => 4, 
     'otherId' => null, 
     'name' => 'item 5' 
    ] 
]; 


$output = [ 
    [ 
     'id' => 1 
     'name' => 'item 1' 
    ], 
    [ 
     'id' => 2 
     'name' => 'item 2' 
    ], 
    [ 
     'id' => 3 
     'name' => 'item 3' 
    ], 
    [ 
     'id' => 4 
     'name' => 'item 4' 
    ], 
    [ 
     'id' => 3, 
     'otherId' => null, 
     'name' => 'item 4' 
    ], 
    [ 
     'id' => 4, 
     'otherId' => null, 
     'name' => 'item 5' 
    ] 
]; 
+0

_“所以我正在寻找这样做的最有效的方法”_ - 那么请告诉我们你已经找到/开发和尝试了哪些方法。 – CBroe

+0

@CBroe循环内有一个循环,并检查这些值是否匹配。但我想避免使用嵌套循环。我会用这个例子更新我的问题。 – jlmmns

+0

你可以发布你的原始代码,合并 – gwillie

回答

2

你是指这样的:

<?php 

$array1 = array(
    array(
     'id' => 1, 
     'name' => 'item 1' 
    ), 
    array(
     'id' => 2, 
     'name' => 'item 2' 
    ), 
    array(
     'id' => 3, 
     'name' => 'item 3' 
    ), 
    array(
     'id' => 4, 
     'name' => 'item 4' 
    ) 
); 

$array2 = array(
    array(
     'id' => 1, 
     'otherId' => 2, 
     'name' => 'item 2' 
    ), 
    array(
     'id' => 2, 
     'otherId' => 3, 
     'name' => 'item 3' 
    ), 
    array(
     'id' => 3, 
     'otherId' => null, 
     'name' => 'item 4' 
    ), 
    array(
     'id' => 4, 
     'otherId' => null, 
     'name' => 'item 5' 
    ) 
); 

$output = $array1; 
for($i=0,$c=sizeof($array2);$i<$c;$i++){ 
    if(is_null($array2[$i]['otherId'])) 
     array_push($output, $array2[$i]); 
} 

var_dump($output); 

活生生的例子see here

,你也可以做array_push()直接放入$阵列1,以减少内存使用。例如here

+0

这两个数组中的项目的顺序和数量是不一样的,所以这不起作用,我想? – jlmmns

+0

是的,这只会与otherId == null一起使用。 我看到您刚刚添加的代码。这不会起作用。 – dododo

+0

啊,起初我没有看到'$ c = sizeof($ array2)'!我马上试试这个! – jlmmns

0

这个怎么样功能:

function searchForId($id, $array) { 
foreach ($array as $key => $val) { 
    if ($val['uid'] === $id) { 
     return $key; 
    } 
    } 
    return null; 
} 

你可以用它来搜索阵列。 为了避免混淆,我只是将其粘贴,以便于查看解决方案。完整的解决方案可以在https://stackoverflow.com/a/6661561/1238227感谢@Jakub Truneček

+0

干净,但这仍然是一个嵌套的循环。 – jlmmns

+0

这是事实...但这是我找到的最好的方式... –

+0

是的,在主循环中使用它仍然很不错。更少的混乱代码。 – jlmmns

相关问题