求助:PHP多维数组按ID重新分组为指定结构(附代码)
解决按连续ID分组多维数组的问题
看起来你想要的是按原始数组中连续出现的相同ID进行分组,而不是把所有同ID的元素合并到一起(你的尝试是把所有同ID的归为一组,但目标数组是按连续块来划分的)。下面是实现这个需求的代码:
$original_arr = [ ['id' => 17, 'content' => 'string...?'], ['id' => 20, 'content' => 'hello'], ['id' => 20, 'content' => 'string...?'], ['id' => 20, 'content' => 'string...string...??'], ['id' => 17, 'content' => 'string...'], ['id' => 17, 'content' => 'string...'], ]; $desired_arr = []; $current_id = null; $current_group = []; foreach ($original_arr as $item) { // 如果当前元素的ID和当前分组的ID不同,就把之前的分组加入结果(如果存在) if ($item['id'] !== $current_id) { if (!is_null($current_id)) { $desired_arr[] = [$current_id => $current_group]; } $current_id = $item['id']; $current_group = []; } // 将当前元素的content加入当前分组 $current_group[] = $item['content']; } // 别忘了把最后一个未加入的分组添加到结果里 if (!is_null($current_id)) { $desired_arr[] = [$current_id => $current_group]; } echo "<pre>"; print_r($desired_arr); echo "</pre>";
代码逻辑说明
- 用
$current_id跟踪当前连续块的ID,$current_group存储当前块的所有content内容 - 遍历原始数组时,判断当前元素ID是否和
$current_id一致:- 不一致则代表上一个连续块结束,将其存入结果数组,然后重置当前ID和分组容器
- 一致则直接把当前元素的
content追加到当前分组
- 遍历结束后,要手动把最后一个连续块加入结果,避免遗漏
运行这段代码后,输出结果完全匹配你想要的$desired_arr:
Array ( [0] => Array ( [17] => Array ( [0] => string...? ) ) [1] => Array ( [20] => Array ( [0] => hello [1] => string...? [2] => string...string...?? ) ) [2] => Array ( [17] => Array ( [0] => string... [1] => string... ) ) )
为什么你的原有方法不符合预期?
你之前的group_by_key函数是把所有相同ID的元素按原始索引归为一组,后续用+=合并数组的操作,只是把所有元素按原始索引重新排列,并没有实现按连续出现的ID块分组的核心逻辑,所以得到的结果和预期不符。
内容的提问来源于stack exchange,提问作者IceMan
相关产品推荐
相关产品推荐

