You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 09:51:45