基于共同的列值将两个数组合并为一个数组

3

我正在尝试合并两个数组,同时考虑它们的共同值。

$array1 = array(
    array("id" => "1","name"=>"John"),
    array("id" => "2","name"=>"Peter"),
    array("id" => "3","name"=>"Tom"),
    array("id" => "12","name"=>"Astro")
);

$array2 = array(
    array("id" => "1","second_name"=>"Lim"),
    array("id" => "2","second_name"=>"Parker"),
    array("id" => "3","second_name"=>"PHP")
);

我的期望输出:

$result = array(
    array("id" => "1","name"=>"John","second_name"=>"Lim"),
    array("id" => "2","name"=>"Peter","second_name"=>"Parker"),
    array("id" => "3","name"=>"Tom","second_name"=>"PHP"),
    array("id" => "12","name"=>"Astro")
);

我试过了

$arraycomb = array_unique(array_merge($array1,$array2), SORT_REGULAR);

我的输出是:
Array
(
    [0] => Array
        (
            [id] => 1
            [name] => John
        )

    [1] => Array
        (
            [id] => 2
            [name] => Peter
        )

    [2] => Array
        (
            [id] => 3
            [name] => Tom
        )

    [3] => Array
        (
            [id] => 12
            [name] => Astro
        )

    [4] => Array
        (
            [id] => 1
            [second_name] => Lim
        )

    [5] => Array
        (
            [id] => 2
            [second_name] => Parker
        )

    [6] => Array
        (
            [id] => 3
            [second_name] => PHP
        )

)

如何将相同数组中的键值组合起来?或者如何得到期望的输出?
注意:我正在尝试获取值,而不是键。参考:PHP数组合并相同键的两个数组

最终数组的大小将是多少?与第一个数组相等还是第二个数组? - Sougata Bose
3个回答

5

或者,您可以在这种情况下使用foreach,然后如果它们共享相同的id键,则合并它们

使用引用&

foreach($array1 as &$value1) {
    foreach ($array2 as $value2) {
        if($value1['id'] == $value2['id']) {
            $value1 = array_merge($value1, $value2);
        }
    }
}

echo '<pre>';
print_r($array1);

@AresDraguna 哪个答案在执行时需要更少的时间?当我接受答案后,其他人可能会尝试使用这段代码,所以... - DonOfDen
@TomPHP :)) 怎么回事?所以,如果你在第一个数组的第4个位置有 array("id" => "12","name"=>"Astro") ,并且在第二个数组的第4个位置有 array("id" => "7","second_name"=>"Lim"),并且它们具有不同的id,你想要合并或映射它们吗?它们有不同的id!我不明白... - Ares Draguna
如果ID不同,则数组应该只是合并到结果数组中...请查看预期输出数组以获得更好的理解。 - DonOfDen
他希望将两个数组的所有元素合并到新数组中。如果第一个数组中的元素可用,则合并;如果第二个数组中的元素可用,则合并第二个数组的元素。 - Sougata Bose
1
当然了...我并不评判他想要实现什么,我只是认为在我的观点里逻辑有误...我是一名“纯种”的PHP程序员,对我来说事情必须是有逻辑的,否则我就无法编写代码 :)) 这是我生命中最大的弱点之一。 - Ares Draguna
显示剩余4条评论

3
您可以使用array_map()来实现此功能。尝试这样做 -
function modifyArray($a, $b)
{
    if (!empty($a) && !empty($b)) {
        return array_merge($a, $b);
    } else if (!empty($a) && empty($b)) {
        return $a;
    }  else if (empty($a) && !empty($b)) {
        return $b;
    }
}

$new = array_map("modifyArray", $array1, $array2);
var_dump($new);

它将生成一个包含两个数组中所有值的新数组。如果第一个数组中的元素为空,则合并第二个数组,反之亦然。

1
这个解决方案只有在ID不重要的情况下才有帮助,因为当它们合并时,ID将会重叠。 - Sougata Bose
好的!我添加了一个备用键来作为参考的ID。谢谢! - DonOfDen

0

为了帮助识别行,将临时第一级键分配给您的第一个数组。然后循环第二个数组,并将所需列值附加到适当的组中。循环后使用array_values()重新索引数组。

代码:(演示)

$result = array_column($array1, null, 'id');
foreach ($array2 as $row) {
    $result[$row['id']]['second_name'] = $row['second_name'];
}
var_export(array_values($result));

这是一种比使用嵌套循环扫描数组更直接的方法。


如果第二个数组中的所有ID都存在于第一个数组中,则可以在foreach()的主体内编写以下更简单的代码行。
$result[$row['id']] += $row;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接