通过共享列值合并两个二维数组

问题描述 投票:0回答:6

我知道这很容易通过

foreach
完成,然后是
while
->list 等过程(我已经完成了),但是我感觉我的代码有点脏而且看起来不就像最好的解决方案...我正在寻找使用本机 PHP 数组函数来执行以下操作:

我有两个如下所示的数组:

[
    ['rank' => '579', 'id' => '1'],
    ['rank' => '251', 'id' => '2'],
]

[
    ['size' => 'S', 'status' => 'A', 'id' => '1'],
    ['size' => 'L', 'status' => 'A', 'id' => '2'],
]

我需要合并它们来生成:

[
    ['size' => 'S', 'status' => 'A', 'id' => '1', 'rank' => '579'],
    ['size' => 'L', 'status' => 'A', 'id' => '2', 'rank' => '251'],
]

有没有办法能够将两个数组与

id
值(或任何其他值)合并,而不会进入无穷无尽的
foreach
集合?

php arrays multidimensional-array merge
6个回答
16
投票

使用 array_merge_recursive()

$array = array_merge_recursive($array1, $array2);

或者制作自己的函数(可能会更快)

function my_array_merge(&$array1, &$array2) {
    $result = Array();
    foreach($array1 as $key => &$value) {
        $result[$key] = array_merge($value, $array2[$key]);
    }
    return $result;
}
$array = my_array_merge($array1, array2);
print_r($array);

7
投票

正如雷在评论中注意到的那样,接受的答案实际上并没有回答问题。我无法找到答案,所以我创建了以下小实用函数:

function array_merge_callback($array1, $array2, $predicate) {
    $result = array();

    foreach ($array1 as $item1) {
        foreach ($array2 as $item2) {
            if ($predicate($item1, $item2)) {
                $result[] = array_merge($item1, $item2);
            }
        }
    }

    return $result;
}

使用方法如下:

array_merge_callback($array1, $array2, function ($item1, $item2) {
    return $item1['id'] == $item2['id'];
});

2
投票

像其他语言一样,有一个很好的合并数组的方法。 这是因为php有自动编号数组元素的功能,合并时会重复或用键替换不同的元素。

现在变了。

// array_fork
  public static function array_fork() {
    $args = func_get_args();
    $result = array();
    foreach ($args as $arr) {
      is_array($arr) || exit('[' . __METHOD__ . '] Each item must be an array.');
      foreach ($arr as $key => $val) {
        if (is_array($val)) {
          // recursion
          !isset($result[$key]) && $result[$key] = array();
          $result[$key] = self::array_fork($result[$key], $arr[$key]);
          continue;
        }
        if (is_numeric($key)) {
          if (!in_array($arr[$key], $result))
            $result[] = $arr[$key];
        } else
          $result[$key] = $arr[$key];
      }
    }
    return $result;
  }

2
投票
function custom_array_merge(&$array1, &$array2) {
    $result = Array();
    foreach ($array1 as $key_1 => &$value_1) {
        // if($value['name'])
        foreach ($array2 as $key_1 => $value_2) {
            if($value_1['name'] ==  $value_2['name']) {
                $result[] = array_merge($value_1,$value_2);
            }
        }

    }
    return $result;
}

// 传递 $array1, &$array2 并更改 $value_2['name'] // 根据您要合并的名称。


1
投票

好吧,假设你的数组名为 $arr1 和 $arr2,你可以这样做:

<?php
$newarray = Array();
foreach ($arr1 as $element=>$value){
    $newarray = array_merge($arr1[$element],$arr2[$element])
}
?>

1
投票

没有必要使用递归技术或多个循环。 将两个数组合并在一起,然后根据行的

id
值在输出数组中分配临时第一级键。 如果第一次遇到
id
,则将该行数据与空数组合并;否则合并结果数组中预先存在的行数据。 要在循环后删除第一级键,请调用
array_values()

代码:(演示

$a = [
    ['rank' => '579', 'id' => '1'],
    ['rank' => '251', 'id' => '2'],
];

$b = [
    ['size' => 'S', 'status' => 'A', 'id' => '1'],
    ['size' => 'L', 'status' => 'A', 'id' => '2'],
];

$result = [];
foreach (array_merge($a, $b) as $row) {
    $result[$row['id']] = $row + ($result[$row['id']] ?? []);
}
var_export(array_values($result));

不是由问题的样本数据表示的,如果两个数据集在各自的

id
组中存在柱状数据冲突,那么后面遇到的值将覆盖之前存储的值。 演示 要反转该行为,您只需交换“数组联合运算符”两侧的数据即可。 演示 请注意,数组并集适用于这种情况,因为行包含非数字键。 对于其他场景,使用
array_merge()
array_replace()
代替联合运算符可能更可靠。

如果相关列具有不同的名称,则不要按

$row['id']
进行分组,而是将分组值缓存为变量并回退到备用列名称。
($groupKey = $row['id'] ?? $row['otherId'];

© www.soinside.com 2019 - 2024. All rights reserved.