You need to enable JavaScript to run this app. PHP嵌套多维数组中合并相同groupId对应groupRoles的实现问题
优惠活动
大模型
产品
解决方案
定价
更多

PHP嵌套多维数组中合并相同groupId对应groupRoles的实现问题

问题根源

现有代码每次遍历匹配到用户所属分组时,都会直接新建分组结构追加到$groups数组,未校验当前groupId是否已存在,最终导致重复分组条目。

解决逻辑

用groupId作为临时关联数组的键做快速匹配,遍历过程中合并同分组的角色,遍历结束后再转为普通索引数组即可,同时还能避免同分组重复查库的性能损耗。

调整后代码

// 先定义临时关联数组存储分组,key为groupId,避免重复
$tmp_groups = [];
foreach ($groupmeta as $value) {
    $array = unserialize($value['property_value']);
    if ($array[0] == $user_ID) {
        $group_id = $value['group_id'];
        $group_role = $array[1];

        // 已存在该分组,直接追加角色
        if (isset($tmp_groups[$group_id])) {
            $tmp_groups[$group_id]['groupRoles'][] = $group_role;
            continue;
        }

        // 不存在该分组,查库初始化分组信息
        $group_name_q= json_decode(json_encode($wpdb->get_results($wpdb->prepare('SELECT group_name FROM groups WHERE id=%s', $group_id))), true);
        $group_name = $group_name_q[0]['group_name'];
        $tmp_groups[$group_id] = [
            'groupId' => $group_id,
            'groupName' => $group_name,
            'groupRoles' => [$group_role]
        ];
    }
}
// 关联数组转普通索引数组,符合输出结构要求
$groups = array_values($tmp_groups);

$return_arr = array(
    "userId"=>$user_ID, 
    "email"=>$user_email, 
    "first"=>$user_first, 
    "last"=>$user_last, 
    "groups"=>$groups
);
echo json_encode($return_arr);

附加说明

如果需要保证groupRoles里没有重复的角色值,可以在追加角色前加存在性判断,或者合并完后用array_unique()去重即可。

内容的提问来源于stack exchange,提问作者Tyler Kanz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 19:45:04