You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实现按指定最小尺寸拆分数组:前小后大且尽可能平衡

实现满足最小块尺寸且平衡分配的数组分块函数

针对原问题中现有方案无法平衡分配多余元素的缺陷,以下是符合要求的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;
}

逻辑说明

  1. 参数校验:拦截无效的最小块尺寸输入,避免非法分块操作。
  2. 确定块数:通过总元素数除以最小块尺寸,得到每块至少满足最小要求时的最大可分块数,这是实现平衡分配的核心前提。
  3. 分配剩余元素:将总元素数按块数均分得到基础尺寸,剩余元素均匀追加到最后几个块中,确保块尺寸差异最小,且前块尺寸不大于后块。
  4. 生成结果:通过array_slice按计算好的尺寸截取原数组,组装成分块结果。

测试案例验证

以下测试输入均符合预期输出:

  1. 输入:$minChunk = 3; $array = range(1, 8);
    [[1,2,3,4],[5,6,7,8]]
    
  2. 输入:$minChunk = 4; $array = range(1, 11);
    [[1,2,3,4,5],[6,7,8,9,10,11]]
    
  3. 输入:$minChunk = 2; $array = range(1, 5);
    [[1,2],[3,4,5]]
    
  4. 输入:$minChunk = 3; $array = range(1, 9);
    [[1,2,3],[4,5,6],[7,8,9]]
    
  5. 输入:$minChunk = 7; $array = range(1, 13);
    [[1,2,3,4,5,6,7,8,9,10,11,12,13]]
    
  6. 输入:$minChunk = 1; $array = range(1, 4);
    [[1],[2],[3],[4]]
    

内容的提问来源于stack exchange,提问作者mickmackusa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 05:45:12