PHP按子数组name值分组多维数组并合并action字段
解决方案
核心思路是利用resource.name作为分组标识,遍历原数组时将同组的action收集为数组,最后整理成目标结构:
<?php // 原数组(假设已通过json_decode解析得到) $originalArray = [ 'abc' => [ [ 'foo' => '*', 'action' => 'Read', 'resource' => [ 'name' => 'name_1', 'patternType' => 'fixed', 'type' => 'partition', ], ], [ 'foo' => '*', 'action' => 'Write', 'resource' => [ 'name' => 'name_1', 'patternType' => 'fixed', 'type' => 'partition', ], ], [ 'foo' => '*', 'action' => 'Read', 'resource' => [ 'name' => 'name_2', 'patternType' => 'fixed', 'type' => 'partition', ], ], [ 'foo' => '*', 'action' => 'Alter', 'resource' => [ 'name' => 'name_2', 'patternType' => 'fixed', 'type' => 'partition', ], ], ], ]; // 初始化临时分组数组 $grouped = []; // 遍历原数组的abc节点下所有元素 foreach ($originalArray['abc'] as $item) { $resourceName = $item['resource']['name']; // 首次遇到该资源名时,初始化分组结构 if (!isset($grouped[$resourceName])) { $grouped[$resourceName] = [ 'foo' => $item['foo'], 'action' => [$item['action']], 'resource' => $item['resource'] ]; } else { // 已存在则追加action到数组 $grouped[$resourceName]['action'][] = $item['action']; } } // 将分组后的关联数组转为索引数组,匹配目标结构 $result = [ 'abc' => array_values($grouped) ]; // 生成格式化后的JSON文件 file_put_contents('result.json', json_encode($result, JSON_PRETTY_PRINT)); // 输出结果验证 print_r($result); ?>
代码说明
- 用
resource.name作为临时数组的键,确保同资源的元素被归为一组 - 首次处理资源时,将单个
action转为数组格式 - 后续遇到同资源元素,直接把
action追加到对应数组中 - 通过
array_values()将关联数组转为索引数组,匹配目标结构 - 利用
json_encode()的JSON_PRETTY_PRINT参数生成可读性强的JSON文件
内容的提问来源于stack exchange,提问作者Chris C
相关产品推荐
相关产品推荐

