
本文介绍如何将嵌套数组中各公司对应的办公室编号及其金额提取出来,按办公室编号分组,并支持后续按编号自然排序,最终形成以办公室编号为键、公司与金额映射为值的结构化数组。
本文介绍如何将嵌套数组中各公司对应的办公室编号及其金额提取出来,按办公室编号分组,并支持后续按编号自然排序,最终形成以办公室编号为键、公司与金额映射为值的结构化数组。
在实际业务中,我们常遇到类似需求:原始数据按公司组织,但需按办公室编号(如 N1、N32、N40)横向聚合分析。题中数组结构为“公司 → 办公室子数组”,而目标是反转为“办公室编号 → 各公司对应金额”,即实现按键(office key)分组 + 可排序的二维映射结构。
正确的数据重组逻辑
首先需遍历原始数组,逐层解构:
- 外层循环获取每个公司(
$value['Company']); - 内层遍历其
offic子数组,提取键(如'N40')和值(如'4000$'); - 将相同 office 键的所有公司-金额对归入
$newArray[$officKey],使用[]=追加关联子数组。
$Array = [
[
'Company' => 'Lotos',
'offic' => [
'N40' => '4000$',
'N32' => '1000$',
]
],
[
'Company' => 'Lump',
'offic' => [
'N32' => '7000$',
'N1' => '3400$',
'N40' => '1000$',
]
]
];
$newArray = [];
foreach ($Array as $value) {
foreach ($value['offic'] as $officKey => $officValue) {
// 确保 $newArray[$officKey] 是数组,然后追加 [公司名 => 金额]
$newArray[$officKey][] = [$value['Company'] => $officValue];
}
}执行后,$newArray 结构如下:
YC式产品思维办公室。用第一性原理拆解产品想法,通过六问逼问法验证需求真伪, 挑战前提假设,生成多种实现方案。输出设计文档而非代码。 Use when: 用户说"帮我想想这个点子"、"这个值不值得做"、"brainstorm"、 "产品规划"、"需求分析"、"帮我理清思路",或描述一个新的产品/功能想法时。 在任...
[ 'N40' => [['Lotos' => '4000$'], ['Lump' => '1000$']], 'N32' => [['Lotos' => '1000$'], ['Lump' => '7000$']], 'N1' => [['Lump' => '3400$']] ]
按办公室编号排序(支持自然顺序)
由于 office 键含字母前缀(如 N1, N32, N40),直接 ksort() 会按字符串字典序排(N1 N32 N40 ✅),但若存在 N100 和 N20,则需自然排序:
uksort($newArray, function($a, $b) {
return strnatcmp($a, $b); // 自然比较:N1 < N20 < N100
});进阶:合并同 office 下的金额(可选)
若需汇总同一 office 的总金额(如 N40 → '5000$'),可在内层循环中解析数字并累加:
$sumArray = [];
foreach ($Array as $value) {
foreach ($value['offic'] as $officKey => $officValue) {
$amount = (float) preg_replace('/[^0-9.]/', '', $officValue);
$sumArray[$officKey] = ($sumArray[$officKey] ?? 0) + $amount;
}
}
// 输出:['N40' => 5000.0, 'N32' => 8000.0, 'N1' => 3400.0]注意事项
- 原始代码中
uksort($item['offic'])错误地试图对单个子数组排序,且未传入比较函数;uksort需作用于待排序数组本身,并返回布尔值,不能链式赋值。 -
N40等键名在 PHP 中若未加引号,会被解释为常量——务必使用字符串键('N40'),否则运行时触发Notice: Use of undefined constant。 - 若 office 键格式不统一(如混用
n40/N40),建议先标准化:$officKey = strtoupper($officKey)。
通过以上步骤,你即可稳健实现“按 office 编号分组 → 排序 → 扩展聚合”的完整流程,适用于报表生成、跨部门统计等典型场景。

















