9

假设我有以下数组:

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. 所需的输出排序应与第一个数组中的相同。

我怎样才能做到这一点?任何帮助深表感谢。

4

7 回答 7

10

您可以只做一个嵌套循环并检查id值是否匹配,然后添加title$first(或name$second

foreach($first as $key => $value){
    foreach($second as $value2){
        if($value['id'] === $value2['id']){
            $first[$key]['title'] = $value2['title'];
        }               
    }
}
于 2012-12-02T13:28:07.410 回答
2

你的代码工作正常。您的期望完全不正确。例如,在一个数组中,第 4 个元素id包含 1,但在另一个数组中,第 4 个元素id为 5,因此您的“将这些数组合并到相同的 id”是没有意义的,因为通过将第 4 个元素合并到一个元素中,您也可以合并它们的子元素,并且因为id使用在两个数组中,一旦值必须消失,因为数组中不能有两个相等的键。

编辑

您必须手动合并,因为 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;
     }
  }
}
于 2012-12-02T13:14:52.020 回答
2

提供在PHP 5.5+.

由于两个数组的顺序不相同,首先使用array_column来索引数组id

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

array_replace_recursive将合并与两个数组集的索引关联匹配的数组中的值。

可选地用于array_values重新索引数组,删除id索引关联。

示例https://3v4l.org/ndv2j

$first = array_column($first, null, 'id');
$second = array_column($second, null, 'id');
$result = array_values(array_replace_recursive($first, $second));

结果

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
        )

)
于 2018-11-03T18:36:16.507 回答
1

不要在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';
}
于 2017-11-24T08:45:58.587 回答
1

这可以使用 3 参数形式轻松完成,通过值array_column重新索引您的second数组id,然后遍历first数组,合并匹配second值的内容(它存在的地方):

$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
        )
)

3v4l.org 上的演示

这比 Will B. 的不重新索引first数组的答案具有优势。由于只有一次调用array_column而没有调用array_values.

更新

这段代码实际上可以通过使用数组联合运算符( )加快速度+(感谢@mickmackusa):

$second = array_column($second, null, 'id');
foreach ($first as &$subject) {
    $subject += $second[$subject['id']] ?? [];
}

这段代码的输出与上面相同,但它再次运行速度提高了大约 10%。

3v4l.org 上的演示

于 2020-10-12T06:16:53.720 回答
0

按您的“id”字段对两个数组进行排序,然后让 php 使用 array_replace_recursive 进行合并。

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

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

$result = array_replace_recursive($array1, $array2);
于 2012-12-02T14:07:06.293 回答
0

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

$items = array_map(function($itemFirstArray, $itemSecondArray) {
  return array_merge($itemFirstArray, $itemSecondArray);
}, $firstArray, $secondArray);
于 2018-01-15T13:10:42.077 回答