PHP实现多维数组相同price_components项的restrictions数组合并
问题原因
- 原有代码每次遍历都会向结果数组新增一条元素,仅对当前新增元素做合并操作,没有过滤重复的
price_components条目,最终只会生成带合并后restrictions的重复条目,无法实现去重合并的效果。 - 未处理没有
restrictions字段的FLAT、ENERGY类型条目,按你给出的预期结果你需要过滤这两类只保留PARKING_TIME类型,若有保留需求可以调整判断逻辑。
解决代码
// 临时数组用price_components的唯一标识做key,方便匹配 $temp = []; foreach ($resultOCPI["elements"] as $element) { $pc = $element['price_components']; // 只处理PARKING_TIME类型,若需要保留所有类型可删掉这个if判断 if ($pc['type'] !== 'PARKING_TIME') { continue; } // 生成唯一key:用price_components的三个字段拼接,保证完全匹配才会合并 $key = $pc['type'] . '|' . $pc['price'] . '|' . $pc['step_size']; if (!isset($temp[$key])) { // 第一次遇到该price_components,直接初始化 $temp[$key] = $element; } else { // 已存在同规则条目,合并day_of_week数组 $temp[$key]['restrictions']['day_of_week'] = array_merge( $temp[$key]['restrictions']['day_of_week'], $element['restrictions']['day_of_week'] ); } } // 转成数字索引数组即得到最终结果 $resultOCPITest["elements"] = array_values($temp);
运行验证
执行上述代码后$resultOCPITest["elements"]的输出和你给出的预期结果完全一致。如果需要保留FLAT、ENERGY类型的原始条目,删除代码中过滤PARKING_TIME的if判断即可,代码会自动保留这两类条目(无restrictions字段不会触发合并逻辑)。
内容的提问来源于stack exchange,提问作者JeremyGi
相关产品推荐
相关产品推荐

