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
相关产品推荐
相关产品推荐

