PHP关联数组结构调整:任务数据层级重构问题
问题分析与修正方案
嘿,我看出来你现在的核心问题是数组层级的构建逻辑混乱,不仅把本该平级的结构嵌套错了,还把单个属性(比如负责人名称、任务ID)当成数组累加,导致输出结构完全不符合预期。咱们来一步步调整代码,实现你想要的「负责人→项目→任务」层级结构:
修正后的代码
$todayArray = []; foreach ($developers as $devId) { // 初始化当前负责人的基础结构,避免重复赋值 if (!isset($todayArray[$devId])) { $todayArray[$devId] = [ 'id' => $devId, 'responsibleName' => '', 'project' => [] ]; } // 遍历所有待办项,匹配当前负责人的任务 foreach ($data["todo-items"] as $task) { if ($task['responsible-party-id'] === $devId) { // 负责人名称仅赋值一次(同一ID对应唯一名称) if (empty($todayArray[$devId]['responsibleName'])) { $todayArray[$devId]['responsibleName'] = $task['responsible-party-names']; } // 检查当前项目是否已存在于负责人的项目列表中 $projectIndex = -1; foreach ($todayArray[$devId]['project'] as $idx => $project) { if ($project['project-id'] === $task['project-id']) { $projectIndex = $idx; break; } } // 项目不存在则新增条目 if ($projectIndex === -1) { $todayArray[$devId]['project'][] = [ 'project-id' => $task['project-id'], 'task' => [] ]; $projectIndex = count($todayArray[$devId]['project']) - 1; } // 将当前任务添加到对应项目的任务列表 $todayArray[$devId]['project'][$projectIndex]['task'][] = [ 'id' => $task['id'], 'content' => $task['content'], 'progress' => $task['progress'], 'completed' => $task['completed'] ]; } } // 移除无任务的负责人条目(可选,按需保留) if (empty($todayArray[$devId]['project'])) { unset($todayArray[$devId]); } }
关键调整说明
- 层级结构修正:把
project数组直接放在负责人的顶级结构下,不再错误嵌套到responsibleName里,严格遵循「负责人→项目→任务」的层级 - 负责人名称优化:同一个负责人的名称仅赋值一次,不再存储为数组,而是直接保留字符串类型
- 项目分组逻辑:新增任务前先检查项目是否已存在,避免重复创建项目条目,同一项目下的任务会自动归组
- 任务独立存储:每个任务作为完整的独立数组对象,不再把
content、progress等属性累加为数组,确保每个任务的属性独立对应
关于期望输出的注意点
你期望的输出里,
project数组的结构在PHP中是不规范且存在隐患的:数组不能同时用数字索引存储项目ID,又用关联键task存储任务,这会导致后续的task键覆盖前面的条目,最终只能保留最后一个任务。上面的代码采用了更合理的结构——每个项目是一个包含project-id和task列表的独立数组,既清晰又避免了数据覆盖问题。
内容的提问来源于stack exchange,提问作者NullEins
相关产品推荐
相关产品推荐

