
本文介绍如何将嵌套数组中各公司对应的办公室编号(如 n1、n32、n40)提取出来,按编号分组聚合,并支持后续按编号自然/字典序排序,最终形成以办公室编号为键、公司名与金额映射为值的结构化数组。
本文介绍如何将嵌套数组中各公司对应的办公室编号(如 n1、n32、n40)提取出来,按编号分组聚合,并支持后续按编号自然/字典序排序,最终形成以办公室编号为键、公司名与金额映射为值的结构化数组。
在处理企业数据时,常需按统一维度(如办公室编号)重新组织分散在多个记录中的信息。原始数据中,每个公司('Company')拥有一个 offic 子数组,其键为办公室编号(如 'N40')、值为对应金额(如 '4000$')。目标是按办公室编号归类所有公司及其金额,并确保结果可进一步排序。
✅ 正确实现思路:先重组,再排序
直接对子数组调用 uksort() 或 sort() 无效,是因为这些函数作用于单个数组,而我们需要的是跨公司、按键(office key)横向聚合。正确做法是:
- 遍历所有公司记录;
-
对每个公司的
offic数组,逐项提取key => value; -
以 office key(如
'N40')为新数组主键,将['Company' => 'amount']追加到对应键下(注意使用[]=实现多值累积)。
以下是完整可运行代码:
<?php
$Array = [
[
'Company' => 'Lotos',
'offic' => [
'N40' => '4000$',
'N32' => '1000$',
]
],
[
'Company' => 'Lump',
'offic' => [
'N32' => '7000$',
'N1' => '3400$',
'N40' => '1000$',
]
]
];
// 步骤1:按 office key 分组聚合
$newArray = [];
foreach ($Array as $item) {
foreach ($item['offic'] as $officKey => $officValue) {
// 确保 $newArray[$officKey] 是数组,然后追加 [公司 => 金额]
$newArray[$officKey][$item['Company']] = $officValue;
}
}
// 步骤2:按 office 编号排序(自然排序更符合 N1/N32/N40 的语义)
uksort($newArray, function($a, $b) {
return strnatcmp($a, $b); // 支持 N1 < N32 < N40
});
// 输出验证
var_dump($newArray);
?>输出示例:
array(3) {
["N1"]=>
array(1) {
["Lump"]=> string(6) "3400$"
}
["N32"]=>
array(2) {
["Lotos"]=> string(6) "1000$"
["Lump"]=> string(6) "7000$"
}
["N40"]=>
array(2) {
["Lotos"]=> string(6) "4000$"
["Lump"]=> string(6) "1000$"
}
}⚠️ 注意事项
-
键名必须加引号:原始示例中
N40 => '4000$'是非法 PHP 语法(未加引号的裸标识符),应写为'N40' => '4000$',否则会触发Parse error; - 避免覆盖同公司重复 office:当前逻辑允许多个公司拥有相同 office 编号;若某公司出现多次相同 office,后赋值会覆盖前值;
-
金额格式处理:若需数值计算(如求和),建议在聚合后用
floatval(str_replace(['$', '%'], '', $value))清洗; -
性能提示:对于超大数据集,可考虑使用
array_reduce替代嵌套foreach,但可读性略低。
该方案清晰分离了「数据重组」与「键排序」两个关注点,结构健壮、易于扩展(例如添加去重、求和、过滤等后续操作),是处理此类横向维度聚合任务的标准实践。

















