如何将数组与标识符合并



我有两个这样的数组:

$arr1 = ['yellow' => 1, 'red', => 5];
$arr2 = ['gray' => 3, 'black' => 8, 'orange' => 6, 'yellow' => 9];

我想要这个结果:

$merged = ['yellow' => [1, 'arr1'], 'red', => [5, 'arr1'], 'gray' => [3, 'arr2'], 'black' => [8, 'arr2'], 'orange' => [6, 'arr2'], 'yellow' =>  [9, 'arr2']];

但是当我阅读有关array_merge()的文档时,它没有这样的选择。有什么功能可以为我做到这一点吗?

这可能是您要查找的:

<?php
$input = [
    'arr1' => ['yellow' => 1, 'red' => 5],
    'arr2' => ['yellow' => 10, 'gray' => 3, 'black' => 8, 'orange' => 6]
];
$output = [];
array_walk($input, function ($entry, $source) use (&$output) {
    foreach ($entry as $key=>$val) {
        $output[$key][] = [$val, $source];
    }
});
print_r($output);

上面代码的输出显然是:

Array
(
    [yellow] => Array
        (
            [0] => Array
                (
                    [0] => 1
                    [1] => arr1
                )
            [1] => Array
                (
                    [0] => 10
                    [1] => arr2
                )
        )
    [red] => Array
        (
            [0] => Array
                (
                    [0] => 5
                    [1] => arr1
                )
        )
    [gray] => Array
        (
            [0] => Array
                (
                    [0] => 3
                    [1] => arr2
                )
        )
    [black] => Array
        (
            [0] => Array
                (
                    [0] => 8
                    [1] => arr2
                )
        )
    [orange] => Array
        (
            [0] => Array
                (
                    [0] => 6
                    [1] => arr2
                )
        )
)

好的,我花了更长的时间才想出这个答案,因为你的问题中有一个错误。请参阅数组 1 中"红色"后面的","。

$arr1 = ['yellow' => 1, 'red' => 5];
$arr2 = ['gray' => 3, 'black' => 8, 'yellow' => 3, 'orange' => 6];
$arrays = ['arr1','arr2'];
$merged = [];
foreach ($arrays as $array) {
  foreach (${$array} as $color => $value) {
    $merged[$color][] = [$value,$array];
  }
}
echo '<pre>';
print_r($merged);
echo '</pre>';

为了保持"黄色"的两个值,我引入了一个额外的数组层。否则我不明白如何保留它们。

因此,代码经过测试并返回:

Array
(
    [yellow] => Array
        (
            [0] => Array
                (
                    [0] => 1
                    [1] => arr1
                )
            [1] => Array
                (
                    [0] => 3
                    [1] => arr2
                )
        )
    [red] => Array
        (
            [0] => Array
                (
                    [0] => 5
                    [1] => arr1
                )
        )
    [gray] => Array
        (
            [0] => Array
                (
                    [0] => 3
                    [1] => arr2
                )
        )
    [black] => Array
        (
            [0] => Array
                (
                    [0] => 8
                    [1] => arr2
                )
        )
    [orange] => Array
        (
            [0] => Array
                (
                    [0] => 6
                    [1] => arr2
                )
        )
)

> 基于@arkascha回答处理重复的版本:

<?php
  $input = [
    'arr1'=> ['yellow' => 1,'red' => 5, 'black' => 4],
    'arr2'=> ['gray' => 3,'yellow' => 3, 'black' => 8,'orange' => 6],
    'arr3'=> ['orange' => 2]
  ];
  $output = [];
  array_walk($input, function ($entry, $source) use (&$output) {
    foreach ($entry as $key=>$val) {
      if(!array_key_exists($key, $output))
        $output[$key] = [[$val, $source]];
      else
        $output[$key][] = [$val, $source];
    }
  });
  echo print_r($output);
?>

PHP小提琴

最新更新