
本文介绍如何将嵌套的公司-办公室数据按办公室编号(如 n1、n32、n40)归类聚合,并自动按键名升序排列,最终生成以办公室编号为键、关联各公司对应金额为值的结构化数组。
本文介绍如何将嵌套的公司-办公室数据按办公室编号(如 n1、n32、n40)归类聚合,并自动按键名升序排列,最终生成以办公室编号为键、关联各公司对应金额为值的结构化数组。
在实际开发中,我们常需对非扁平化结构的数据进行“维度翻转”——例如将「每个公司拥有多间办公室」的原始结构,转换为「每间办公室关联多家公司」的新视图,并按办公室编号有序组织。这并非简单调用 sort() 或 uksort() 即可完成,因为目标不是排序单个子数组,而是跨数组聚合 + 按键自然排序。
以下是一个完整、健壮的实现方案:
✅ 步骤一:数据聚合(按 office key 归组)
首先遍历原始数组,提取每个公司的 'offic' 子数组,将其键(如 'N40')作为新数组的顶层键,把 'Company' => 金额 作为值追加到对应键的数组中:
$Array = [
[
'Company' => 'Lotos',
'offic' => [
'N40' => '4000$',
'N32' => '1000$',
]
],
[
'Company' => 'Lump',
'offic' => [
'N32' => '7000$',
'N1' => '3400$',
'N40' => '1000$',
]
]
];
$newArray = [];
foreach ($Array as $item) {
foreach ($item['offic'] as $officeKey => $amount) {
// 确保 $newArray[$officeKey] 是数组,避免警告
if (!isset($newArray[$officeKey])) {
$newArray[$officeKey] = [];
}
$newArray[$officeKey][$item['Company']] = $amount;
}
}
此时 $newArray 结构如下(尚未排序):
[ 'N40' => ['Lotos' => '4000$', 'Lump' => '1000$'], 'N32' => ['Lotos' => '1000$', 'Lump' => '7000$'], 'N1' => ['Lump' => '3400$'] ]
✅ 步骤二:按键(office number)自然排序
由于办公室编号含字母前缀(如 N1, N32, N40),应使用 ksort()(保持键值关联)或更推荐的 uksort() 配合自然排序函数,确保 N1 (而非字符串默认的 <code>N1 ):
YC式产品思维办公室。用第一性原理拆解产品想法,通过六问逼问法验证需求真伪, 挑战前提假设,生成多种实现方案。输出设计文档而非代码。 Use when: 用户说"帮我想想这个点子"、"这个值不值得做"、"brainstorm"、 "产品规划"、"需求分析"、"帮我理清思路",或描述一个新的产品/功能想法时。 在任...
uksort($newArray, function($a, $b) {
return strnatcmp($a, $b); // 自然顺序比较:N1, N32, N40 ✅
});
? 提示:
strnatcmp()能正确解析N1、N32中的数字部分,避免字典序误判。
✅ 最终结果验证
执行 var_dump($newArray) 将输出符合预期的结构(已按 office 编号自然升序排列):
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、N32等必须是合法字符串(PHP 中若未加引号如N40 => ...会被视为常量,导致Notice: Use of undefined constant错误); - 若需金额数值计算,建议后续用
floatval(str_replace('$', '', $amount))清洗; - 如需保持公司顺序(如按输入顺序),当前方案已满足;若需按公司名排序,可在内层再对
$newArray[$officeKey]调用ksort()。
该方法兼具可读性与扩展性,适用于任意数量公司及办公室变体,是处理此类“横向转纵向”聚合需求的标准实践。










