php - 如果与前一个元素具有相同的键,则合并数组
问题描述
我有这样的关联数组:
[
['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
)
)
推荐阅读
- android-studio - 运行命令 build all 时 Gradle 构建失败
- javascript - 如何在编辑实时预览时动态执行分页符
- angular - Add Custom Attribute to Request Header Angular 6
- apache-spark-dataset - Spark 数据集的 mapPartitionsWithIndex
- node.js - 开发服务器错误从响应数据中读取身份验证令牌
- r - R先知选择日期
- angular - Does fixture.whenStable() actually do anything in my angular tests if not within an async test execution zone?
- javascript - 使用 async/await 在议程中运行作业
- css - 如何在 Firefox 中平滑过渡倒计时(进度)栏?
- angular - 在角度 6 中使用模板时未显示 html 内容