如何按相同category_id对permissions数组进行分组重组
解决方案:按权限分类重组数组
这是一个很常见的数组分组需求,我来给你提供两种实现方式,一种是原生PHP写法,另一种如果是在Laravel里的话可以用集合简化操作:
原生PHP实现
核心思路就是遍历原权限数组,以每个权限对应的分类名称作为新数组的键,把同分类的权限归集到对应的键下。
// 假设原数组是 $originalData(和你提供的结构一致) $originalData = [ 'permissions' => [ [ "id" => 1, "name" => "UserIndex", "desc" => "查看所有用户", "category_id" => 1, "created_at" => null, "updated_at" => null, "pivot" => [], "category" => ["id" => 1, "name" => "用户"] ], [ "id" => 2, "name" => "UserDelete", "desc" => "删除用户", "category_id" => 1, "created_at" => null, "updated_at" => null, "pivot" => [], "category" => ["id" => 1, "name" => "用户"] ], [ "id" => 3, "name" => "UserInfo", "desc" => "查看用户", "category_id" => 1, "created_at" => null, "updated_at" => null, "pivot" => [], "category" => ["id" => 1, "name" => "用户"] ], [ "id" => 4, "name" => "ActivityIndex", "desc" => "查看所有活动", "category_id" => 2, "created_at" => null, "updated_at" => null, "pivot" => [], "category" => ["id" => 2, "name" => "活动"] ] ] ]; // 初始化结果数组,匹配你需要的外层结构 $result = ['permission' => []]; // 遍历每个权限项进行分组 foreach ($originalData['permissions'] as $permission) { $categoryName = $permission['category']['name']; // 如果当前分类还没在结果数组中,先创建空数组容器 if (!isset($result['permission'][$categoryName])) { $result['permission'][$categoryName] = []; } // 将当前权限添加到对应分类下 $result['permission'][$categoryName][] = $permission; } // 输出查看结果 print_r($result);
运行这段代码后,就能得到你期望的结构:分类名称作为键,对应的值是该分类下的所有权限数组。
Laravel集合简化实现
如果你的项目基于Laravel框架,用集合的groupBy方法可以让代码更简洁优雅:
// 把原权限数组转成Laravel集合 $permissions = collect($originalData['permissions']); // 按分类名称分组,并转成你需要的结构 $result = [ 'permission' => $permissions->groupBy(function ($item) { return $item['category']['name']; })->toArray() ]; // 输出结果 print_r($result);
集合的groupBy方法会自动完成分组逻辑,只需要通过回调指定分组依据(这里是分类名称),最后转成数组就能得到和原生写法完全一致的结果。
内容的提问来源于stack exchange,提问作者Phako
相关产品推荐
相关产品推荐

