合并2个数组,在值匹配时保留第2个数组的元素

时间:2013-10-24 10:37:53

标签: php arrays

我想要合并两个数组,但是从第二个数组中省略了与值匹配的元素。 (idotherId

我知道如何在第一个循环中使用第二个循环实现这一点,但我想知道是否可以使用单个循环或特定的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'
    ]
];

2 个答案:

答案 0 :(得分: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()放入$ array1中以减少内存使用量。示例here

答案 1 :(得分: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找到完整的解决方案