首页 > 解决方案 > 如果与前一个元素具有相同的键,则合并数组

问题描述

我有这样的关联数组:

[
    ['one' => 'data 1'],
    ['two' => 'data 2'],
    ['two' => 'data 3'],
    ['three' => 'data 4'],
    ['two' => 'data 5'],
    ['two' => 'data 6'],
    ['two' => 'data 7'],
    ['four' => 'data 8'],
]

我想像这样加入他们:

[
    ['one' => 'data 1'],
    ['two' => ['data 2', 'data 3'] ],
    ['three' => 'data 4'],
    ['two' => ['data 5', 'data 6', 'data 7'] ],
    ['four' => 'data 8'],
]

我已经尝试过 array_map 等,但我无法得到我想要的结果。有任何想法吗?

编辑

我目前的代码是这样的:

$valBefore = null;
$out = [];
foreach($array as $k => $subarray) {
   foreach($subarray as $kk => $vv) {
      if ($valBefore == $kk) {
         $temp = $out[$k-1][$kk];
         $out[$k-1][$kk] = [ $temp, $vv ];
         unset($out[$k]);
      }
      $valBefore = $kk;
   }
   $out[] = $subarray;
}

输出如下:

[
   { "one": "data 1" },
   { "two": [ "data 2", "data 3" ] },
   { "two": "data 3" },
   { "three": "data 4", },
   { "two": [ "data 5", "data 6" ] },
   { "two": [ "data 6", "data 7" ] },
   { "two": "data 7" },
   { "four": "data 8" }
]

unset()仍然无法正常工作)这是我目前最好的代码,我仍然尝试使其适合我想要的输出。

标签: phparrayssortingmerge

解决方案


要获得您想要的结果,您可以使用array_reduce. 在回调中,您将当前元素的键与累加器中最后一个元素的键进行比较。如果它们相同,则将新值推送到该元素,否则将新元素推送到累加器中:

$result = array_reduce($array, function ($c, $a) {
    $len = count($c);
    $key = key($a);
    if ($key == key($c[$len-1] ?? [])) {
        if (is_array($c[$len-1][$key])) {
            $c[$len-1][$key][]= $a[$key];
        }
        else {
            $c[$len-1][$key] = array($c[$len-1][$key], $a[$key]);
        }
    }
    else {
        $c[] = $a;
    }
    return $c;
}, []);

print_r($result);

输出:

Array
(
    [0] => Array
        (
            [one] => data 1
        )
    [1] => Array
        (
            [two] => Array
                (
                    [0] => data 2
                    [1] => data 3
                )
        )
    [2] => Array
        (
            [three] => data 4
        )
    [3] => Array
        (
            [two] => Array
                (
                    [0] => data 5
                    [1] => data 6
                    [2] => data 7
                )
        )
    [4] => Array
        (
            [four] => data 8
        )
)

3v4l.org 上的演示


推荐阅读