
本文讲解如何在 php 的 foreach 循环中正确构建以 process_id 为键、权限 id 列表为值的二维关联数组,避免重复键,实现如 [1002] => ['2', '1'] 的结构。
本文讲解如何在 php 的 foreach 循环中正确构建以 process_id 为键、权限 id 列表为值的二维关联数组,避免重复键,实现如 [1002] => ['2', '1'] 的结构。
在实际开发中,常需将数据库查询结果按某个字段(如 PROCESS_ID)分组聚合,生成嵌套数组结构。原始代码使用 array_push($return, ...) 将所有值线性追加,导致扁平化一维数组;而目标结构要求以进程 ID 为外层数组键,对应一个存放多个权限 ID 的子数组。
正确做法是:先检查外层键是否存在,若不存在则初始化为空数组,再向其子数组追加元素。以下是优化后的完整函数:
function permissions($conn) {
$sql = "SELECT PROCESS_ID, PERMISSION_ID FROM table WHERE PROCESS_ID = 1002";
$result = $conn->executeSQL($sql);
$return = [];
foreach ($result as $value) {
$processId = $value['PROCESS_ID'];
$permissionId = $value['PERMISSION_ID'];
// 确保该 PROCESS_ID 对应的子数组已存在
if (!isset($return[$processId])) {
$return[$processId] = [];
}
// 将权限 ID 追加到对应进程的子数组中
$return[$processId][] = $permissionId;
}
return $return;
}
✅ 关键点说明:
- 使用 $return[$processId][] = $permissionId 是 PHP 中向关联键对应的数组末尾追加元素的简洁写法,等价于 array_push($return[$processId], $permissionId);
- 必须提前用 isset() 检查键是否存在,否则对未定义索引执行 [] 操作会触发 Notice(在严格模式下可能报错);
- SQL 查询字段名需与代码中使用的键名严格一致(如示例中应为 PROCESS_ID 和 PERMISSION_ID,而非问题标题中的 PROCESS/PERMISSION),建议通过调试 var_dump($result[0]) 确认实际字段名;
- 若需支持多个 PROCESS_ID(不止 1002),可移除 SQL 中的 WHERE 条件,并保留逻辑不变——函数将自动按不同 ID 分组。
最终输出即为目标结构:
array(1) {
[1002] => array(2) {
[0] => string(1) "2"
[1] => string(1) "1"
}
}
此模式可轻松扩展至更复杂的嵌套场景(如三级分组、附加元数据等),核心思想始终是:按需初始化父级键,再操作其子结构。










