將陣列依指定組數平均分配,餘數元素分配至前幾組。例如 10 元素分 3 組 → 4, 3, 3。
/**
* 陣列平均分組
*
* @param array $array 待分割陣列
* @param int $groupNum 分組數 (正整數)
* @return array 分組後的二維陣列
*/
function splitArray(array $array, int $groupNum): array
{
// 參數驗證
if (empty($array) || $groupNum <= 0) {
return [];
}
$groupNum = min($groupNum, count($array)); // 組數不超過元素數
$total = count($array);
$baseSize = (int)($total / $groupNum); // 基礎大小
$remainder = $total % $groupNum; // 餘數
$result = [];
$offset = 0;
for ($i = 0; $i < $groupNum; $i++) {
// 前 $remainder 組多分配 1 個元素
$size = $baseSize + ($i < $remainder ? 1 : 0);
$result[] = array_slice($array, $offset, $size);
$offset += $size;
}
return $result;
}
// 測試
$data = range(1, 10); // [1,2,3,4,5,6,7,8,9,10]
print_r(splitArray($data, 3));
/*
Array
(
[0] => Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 )
[1] => Array ( [0] => 5 [1] => 6 [2] => 7 )
[2] => Array ( [0] => 8 [1] => 9 [2] => 10 )
)
*/
| 項目 | 原版本 | 優化版 |
|---|---|---|
| 程式碼行數 | ~60 行 | ~25 行 |
| 迴圈次數 | 多重巢狀 | 單一 for 迴圈 |
| 記憶體操作 | 多次 unset/push | 單次 array_slice |
| 可讀性 | 較難理解 | 邏輯清晰 |