实现按指定最小尺寸拆分数组:前小后大且尽可能平衡
实现满足最小块尺寸且平衡分配的数组分块函数
针对原问题中现有方案无法平衡分配多余元素的缺陷,以下是符合要求的PHP实现,满足:
- 功能类似
array_chunk() - 强制每个块至少包含指定的最小元素数
- 尽可能让块尺寸平衡,多余元素优先分配给后续块(保证前块尺寸≤后块)
- 处理边缘异常:最小块尺寸小于1或大于数组总长度时抛出异常
函数实现
function balanced_array_chunk(array $array, int $minChunk): array { $total = count($array); // 边缘参数校验 if ($minChunk < 1) { throw new InvalidArgumentException("最小块尺寸必须大于等于1"); } if ($minChunk > $total) { throw new InvalidArgumentException("最小块尺寸不能超过数组总元素数"); } // 计算最多可分块数(每块至少满足最小尺寸) $maxChunks = intdiv($total, $minChunk); // 计算基础块尺寸与剩余待分配元素数 $baseSize = intdiv($total, $maxChunks); $remainingElements = $total % $maxChunks; $result = []; $offset = 0; // 生成前(maxChunks - remainingElements)个基础尺寸块 for ($i = 0; $i < $maxChunks - $remainingElements; $i++) { $result[] = array_slice($array, $offset, $baseSize); $offset += $baseSize; } // 生成后remainingElements个尺寸+1的块(分配剩余元素) for ($i = 0; $i < $remainingElements; $i++) { $result[] = array_slice($array, $offset, $baseSize + 1); $offset += $baseSize + 1; } return $result; }
逻辑说明
- 参数校验:拦截无效的最小块尺寸输入,避免非法分块操作。
- 确定块数:通过总元素数除以最小块尺寸,得到每块至少满足最小要求时的最大可分块数,这是实现平衡分配的核心前提。
- 分配剩余元素:将总元素数按块数均分得到基础尺寸,剩余元素均匀追加到最后几个块中,确保块尺寸差异最小,且前块尺寸不大于后块。
- 生成结果:通过
array_slice按计算好的尺寸截取原数组,组装成分块结果。
测试案例验证
以下测试输入均符合预期输出:
- 输入:
$minChunk = 3; $array = range(1, 8);[[1,2,3,4],[5,6,7,8]] - 输入:
$minChunk = 4; $array = range(1, 11);[[1,2,3,4,5],[6,7,8,9,10,11]] - 输入:
$minChunk = 2; $array = range(1, 5);[[1,2],[3,4,5]] - 输入:
$minChunk = 3; $array = range(1, 9);[[1,2,3],[4,5,6],[7,8,9]] - 输入:
$minChunk = 7; $array = range(1, 13);[[1,2,3,4,5,6,7,8,9,10,11,12,13]] - 输入:
$minChunk = 1; $array = range(1, 4);[[1],[2],[3],[4]]
内容的提问来源于stack exchange,提问作者mickmackusa
相关产品推荐
相关产品推荐

