如何根据id对嵌套数组分组?排查PHP实现代码错误
原代码存在的问题
- 变量名不统一:初始化的结果数组名为
$new_persons,但循环逻辑中全部误用为$newArray,两个变量无关联,核心逻辑完全无法生效。 - 分组判断与操作逻辑错误:
in_array($item['id'], $newArray)无法在二维用户数组中匹配到id值——in_array仅能检索一维数组的元素值;就算匹配成功,也无法定位到对应id用户在结果数组中的索引位置,后续$newArray['hobbies']的写法是把索引数组当成关联数组操作,根本无法将爱好追加到对应用户的字段下。 - 存在冗余逻辑:每次循环都预先构造包含单个爱好的
$detail数组,当id已存在于结果集时,这个构造操作完全多余。
修正方案
核心思路是以用户id作为结果数组的临时关联键,可以直接通过id快速定位到对应用户,不需要遍历查找,追加爱好的时间复杂度为O(1),处理完所有数据后如果需要重置为连续数字索引,调用array_values()即可。
修正后的代码:
$new_persons = array(); foreach ($persons as $item) { $uid = $item['id']; // 当前id未存入结果数组时,先初始化用户基础信息和空的爱好数组 if (!isset($new_persons[$uid])) { $new_persons[$uid] = [ 'id' => $item['id'], 'name' => $item['name'], 'hobbies' => [] ]; } // 直接往对应用户的hobbies数组追加当前爱好 $new_persons[$uid]['hobbies'][] = [ 'hobbyId' => $item['hobbyId'], 'hobbyName' => $item['hobbyName'] ]; } // 需要把临时id关联键转为连续数字索引时,取消下一行注释即可 // $new_persons = array_values($new_persons);
运行效果
执行后得到的数组结构完全符合需求:
Array ( [0] => Array ( [id] => 1 [name] => adam [hobbies] => Array ( [0] => Array ( [hobbyId] => x [hobbyName] => swim ) [1] => Array ( [hobbyId] => z [hobbyName] => sing ) ) ) [1] => Array ( [id] => 2 [name] => brian [hobbies] => Array ( [0] => Array ( [hobbyId] => y [hobbyName] => read ) ) ) )
内容的提问来源于stack exchange,提问作者harjed
相关产品推荐
相关产品推荐

