
在PHP开发中,我们经常会遇到需要处理和转换数组结构的情况。特别是在从数据库查询或API接口获取数据时,原始数据可能是一个扁平的关联数组列表,但业务逻辑需要我们将其按照某个特定字段进行分组,形成一个更具层次感的多维数组。
例如,我们可能有一个包含活动日志的数组,其中每个日志条目都有一个object_type字段。我们希望将所有相同object_type的日志条目归类到同一个子数组中,以object_type作为主键。
原始数据结构示例如下:
$originalArray = [
[
'initiator_id' => 259,
'object_type' => 1,
'object_id' => 905,
'date' => '2021-11-16 06:24:16'
],
[
'initiator_id' => 259,
'object_type' => 1,
'object_id' => 905,
'date' => '2021-11-16 04:54:54'
],
[
'initiator_id' => 259,
'object_type' => 1,
'object_id' => 905,
'date' => '2021-11-16 04:53:58'
],
[
'initiator_id' => 219,
'object_type' => 2,
'object_id' => 915,
'date' => '2021-11-16 04:53:58'
],
[
'initiator_id' => 220,
'object_type' => 3,
'object_id' => 916,
'date' => '2021-11-16 04:53:58'
],
[
'initiator_id' => 221,
'object_type' => 2,
'object_id' => 917,
'date' => '2021-11-16 04:53:58'
]
];我们期望的输出结构是:以object_type为顶级键,每个键对应一个数组,该数组中包含所有原始数据中object_type值相同的子数组。
立即学习“PHP免费学习笔记(深入)”;
要实现上述数据重构,最直接有效的方法是遍历原始数组,并根据指定键的值动态地构建新的多维数组。
以下是根据object_type键重构多维数组的PHP代码实现:
<?php
$originalArray = [
['initiator_id' => 259, 'object_type' => 1, 'object_id' => 905, 'date' => '2021-11-16 06:24:16'],
['initiator_id' => 259, 'object_type' => 1, 'object_id' => 905, 'date' => '2021-11-16 04:54:54'],
['initiator_id' => 259, 'object_type' => 1, 'object_id' => 905, 'date' => '2021-11-16 04:53:58'],
['initiator_id' => 219, 'object_type' => 2, 'object_id' => 915, 'date' => '2021-11-16 04:53:58'],
['initiator_id' => 220, 'object_type' => 3, 'object_id' => 916, 'date' => '2021-11-16 04:53:58'],
['initiator_id' => 221, 'object_type' => 2, 'object_id' => 917, 'date' => '2021-11-16 04:53:58'],
];
$groupedArray = []; // 初始化用于存储重构后数据的数组
foreach ($originalArray as $item) {
$objectType = $item['object_type']; // 获取当前项的 object_type 值
// 检查 $groupedArray 中是否已经存在以当前 object_type 为键的子数组
// 如果不存在,则创建一个空的子数组
if (!isset($groupedArray[$objectType])) {
$groupedArray[$objectType] = [];
}
// 将当前项添加到对应的 object_type 子数组中
$groupedArray[$objectType][] = $item;
}
// 输出重构后的数组结构
echo "<pre>";
print_r($groupedArray);
echo "</pre>";
?>执行上述代码后,$groupedArray将输出以下结构:
Array
(
[1] => Array
(
[0] => Array
(
[initiator_id] => 259
[object_type] => 1
[object_id] => 905
[date] => 2021-11-16 06:24:16
)
[1] => Array
(
[initiator_id] => 259
[object_type] => 1
[object_id] => 905
[date] => 2021-11-16 04:54:54
)
[2] => Array
(
[initiator_id] => 259
[object_type] => 1
[object_id] => 905
[date] => 2021-11-16 04:53:58
)
)
[2] => Array
(
[0] => Array
(
[initiator_id] => 219
[object_type] => 2
[object_id] => 915
[date] => 2021-11-16 04:53:58
)
[1] => Array
(
[initiator_id] => 221
[object_type] => 2
[object_id] => 917
[date] => 2021-11-16 04:53:58
)
)
[3] => Array
(
[0] => Array
(
[initiator_id] => 220
[object_type] => 3
[object_id] => 916
[date] => 2021-11-16 04:53:58
)
)
)可以看到,原始数组已成功按照object_type的值(1, 2, 3)进行了分组,每个object_type都对应一个包含其所有相关数据的子数组。
$groupedArray = array_reduce($originalArray, function ($carry, $item) {
$objectType = $item['object_type'];
$carry[$objectType][] = $item;
return $carry;
}, []);这种方式更简洁,但需要理解array_reduce的工作原理。
通过本文的教程,我们学习了如何利用PHP的循环结构和数组操作,将一个扁平的关联数组列表重构为一个按指定键分组的多维数组。这种数据重构技术在处理复杂数据结构和满足特定业务需求时非常实用。掌握这一技巧,将有助于您更灵活高效地管理和操作PHP中的数据。
以上就是PHP多维数组重构:按指定键分组数据的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号