【问题标题】:How can I merge arrays with along an identifier?如何将数组与标识符合并?
【发布时间】:2017-04-05 08:37:01
【问题描述】:

我有两个这样的数组:

$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() 的文档,它没有这样的选项。有什么功能可以帮我做吗?

【问题讨论】:

  • 在arr1和arr2中都可以找到黄色吗?或任何颜色
  • @Vanojx1 是的。 . . !它们不是唯一的,我需要同时保留它们

标签: php arrays function


【解决方案1】:

这可能就是你要找的:

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

        )

)

【讨论】:

  • @stack 希望你一切都好,事情发展如你所愿;-)
  • 如果两个数组中都出现“黄色”,则此代码无法正常工作。它不会保留两个值,而是覆盖。
  • @KIKOSoftware 在这种情况下会输出什么?
  • @Chetan: 输出太长,无法评论……但如果你想知道,试试代码。
  • @KIKOSoftware 当然也可以通过简单的修改。我相应地调整了答案。这个问题本身并没有具体说明这个要求,这就是为什么我完全实现了所要求的。这种修改显然改变了输出格式定义。
【解决方案2】:

好的,我花了一点时间才想出这个答案,因为你的问题有问题。请参阅数组 1 中 'red' 后面的 ','。

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

【讨论】:

    【解决方案3】:

    基于@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 FIDDLE

    【讨论】:

      猜你喜欢
      • 2016-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-27
      • 2020-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多