若数组和上一个元素具有相同的键,则合并数组



我有这样的关联数组:

[
['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()仍然不起作用(这是我目前最好的代码,我仍在努力使它适合我想要的输出。

要获得您想要的结果,您可以使用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 上的演示

最新更新