Php 在特定键上合并两个多维数组

Php 在特定键上合并两个多维数组,php,multidimensional-array,array-merge,Php,Multidimensional Array,Array Merge,假设我有以下数组: Array ( [0] => Array ( [id] => 5 [name] => Education ) [1] => Array ( [id] => 4 [name] => Computers

假设我有以下数组:

Array
    (
        [0] => Array
            (
                [id] => 5
                [name] => Education
            )

        [1] => Array
            (
                [id] => 4
                [name] => Computers
            )

        [3] => Array
            (
                [id] => 7
                [name] => Science

        [4] => Array
            (
                [id] => 1
                [name] => Sports
            )
    )
第二个:

Array
    (
        [0] => Array
            (
                [id] => 1
                [title] => Sport
            )

        [1] => Array
            (
                [id] => 7
                [title] => Sci
            )

        [3] => Array
            (
                [id] => 4
                [title] => Comp

        [4] => Array
            (
                [id] => 5
                [title] => Edu
            )
    )
期望输出为:

Array
    (
        [0] => Array
            (
                [id] => 5
                [name] => Education
                [title] => Edu
            )

        [1] => Array
            (
                [id] => 4
                [name] => Computers
                [title] => Comp
            )

        [3] => Array
            (
                [id] => 7
                [name] => Science
                [title] => Sci

        [4] => Array
            (
                [id] => 1
                [name] => Sports
                [title] => Sport
            )
    )
我已成功地将这些阵列与以下内容合并:

foreach($first as $key => $value){
    $result[$key] = array_merge($first[$key], $second[$key]);
}
但输出组合不正确:

Array
    (
        [0] => Array
            (
                [id] => 5
                [name] => Education
                [title] => Sport
            )

        [1] => Array
            (
                [id] => 4
                [name] => Computers
                [title] => Sci
            )

        [3] => Array
            (
                [id] => 7
                [name] => Science
                [title] => Comp

        [4] => Array
            (
                [id] => 1
                [name] => Sports
                [title] => Edu
            )
    )
问题是我想在同一
id
上合并这些数组。 所需的输出排序应与第一个数组中的相同


我怎样才能做到这一点?非常感谢您的帮助。

您的代码运行良好。你的期望完全不正确。例如,在一个数组中,第四个元素
id
包含1,但在另一个数组中,第四个元素
id
是5,因此“将这些数组合并到同一个id上”没有任何意义,因为将第四个元素合并为一个元素也会合并它们的子元素,并且由于两个数组中都使用了
id
,once值必须消失,因为数组中不能有两个相等的键

编辑

您必须手动合并,因为PHP函数根据键进行合并,而您希望根据内容进行合并:

$result = array();
foreach( $arrayA as $keyA => $valA ) {
  foreach( $arrayB as $keyB => $valB ) {
     if( $valA['id'] == $valB['id'] ) {
       $result[$keyA] = $valA + $valB;

       // or if you do not care output keys, just
       // $result[] = $valA + $valB;
     }
  }
}

您只需执行嵌套循环并检查
id
值是否匹配,然后将
title
添加到
$first
(或
name
添加到
$second


只要两个数组中始终都有每个id,那么按照“id”字段对两个数组进行排序,然后让php进行合并怎么样

function cmp($a, $b) {
  return ((int) $a['id'] < (int) $b['id']) ? -1 : 1;
}

usort($array1, 'cmp');
usort($array2, 'cmp');

$result = array_merge($array1, $array2);
函数cmp($a,$b){
返回((int)$a['id']<(int)$b['id'])?-1:1;
}
usort($array1,'cmp');
usort($array2,'cmp');
$result=array\u merge($array1,$array2);

没有测试代码,但它演示了这个想法。

不要在foreach中使用foreach,当数组太大时,这可能会太慢

$idArray = array_column($secondArray,'title','id');
foreach($firstArray as $key => $val){
  $firstArray[$key]['title'] = (isset($idArray[$val['id']])) ? $idArray[$val['id']] : 'some title';
}

确保项目顺序相同,然后:

$items = array_map(function($itemFirstArray, $itemSecondArray) {
  return array_merge($itemFirstArray, $itemSecondArray);
}, $firstArray, $secondArray);

提供
PHP5.5+
中可用的替代方法

由于两个数组的顺序不同,请首先使用
id
对数组进行索引

这将允许您在
id
索引数组上使用

array\u replace\u recursive
将合并与两个数组集的索引关联相匹配的数组中的值

(可选)使用
array\u值
重新索引数组,删除
id
索引关联

例子 结果

Array
(
    [0] => Array
        (
            [id] => 5
            [name] => Education
            [title] => Edu
        )

    [1] => Array
        (
            [id] => 4
            [name] => Computers
            [title] => Comp
        )

    [2] => Array
        (
            [id] => 7
            [name] => Science
            [title] => Sci
        )

    [3] => Array
        (
            [id] => 1
            [name] => Sports
            [title] => Sport
        )

)

使用的3参数形式可以很容易地完成这项工作,通过
id
值重新索引
second
数组,然后在
first
数组上循环,合并匹配的
second
值的内容(如果存在):

输出:

Array
(
    [0] => Array
        (
            [id] => 5
            [name] => Education
            [title] => Edu
        )
    [1] => Array
        (
            [id] => 4
            [name] => Computers
            [title] => Comp
        )
    [3] => Array
        (
            [id] => 7
            [name] => Science
            [title] => Sci
        )
    [4] => Array
        (
            [id] => 1
            [name] => Sports
            [title] => Sport
        )
)

与Will B.的答案相比,这有一个优势,即不会首先对
数组重新编制索引。由于只调用了一次
array\u列
,而没有调用
array\u值
,因此它的速度也稍快一些(我的测试显示约为10%)

更新

通过使用(
+
)(谢谢@mickmackusa),此代码实际上可以加速得更多:

这段代码的输出与上面相同,但运行速度又提高了10%


我已经更正了输出中的一些错误,对此表示抱歉。我想要的是在第二个数组中找到相同的
id
,这里是
$second[4]['id']
,并将它们合并到新数组中,就像这样:
数组('id'=>5,'name'=>'Education','title'=>'Edu')
。这不可能吗?很有魅力,谢谢:)很抱歉这个标题有误导性。这个的时间复杂性是什么?O(n^2)?这肯定可以做得更好。这个未经测试的代码段的输出显然不正确。在确保两个数组正确排序的代码位上不使用yatta yatta可能是有意义的。需要明确的是,这种技术要求两个数组都包含完全相同的id相关数据。
Array
(
    [0] => Array
        (
            [id] => 5
            [name] => Education
            [title] => Edu
        )

    [1] => Array
        (
            [id] => 4
            [name] => Computers
            [title] => Comp
        )

    [2] => Array
        (
            [id] => 7
            [name] => Science
            [title] => Sci
        )

    [3] => Array
        (
            [id] => 1
            [name] => Sports
            [title] => Sport
        )

)
$second = array_column($second, null, 'id');
foreach ($first as &$subject) {
    $subject = array_merge($subject, $second[$subject['id']] ?? []);
}
Array
(
    [0] => Array
        (
            [id] => 5
            [name] => Education
            [title] => Edu
        )
    [1] => Array
        (
            [id] => 4
            [name] => Computers
            [title] => Comp
        )
    [3] => Array
        (
            [id] => 7
            [name] => Science
            [title] => Sci
        )
    [4] => Array
        (
            [id] => 1
            [name] => Sports
            [title] => Sport
        )
)
$second = array_column($second, null, 'id');
foreach ($first as &$subject) {
    $subject += $second[$subject['id']] ?? [];
}