在 PHP 開發中,經常需要將一個大陣列拆分成多個固定大小的小陣列,例如分頁處理、批次資料匯入或平行運算時。本文介紹一個實用的 splitArray 函式,能依指定組數將陣列平均分配,並妥善處理餘數元素。
函式接受兩個參數:$array 為待分割陣列,$groupNum 為目標組數。執行流程如下:
$allLength,並將 $groupNum 轉為整數。$enum = (int)($allLength / $groupNum)。$enum > 0,先取出可整除的部分 $firstLength = $enum * $groupNum,建立暫存陣列 $firstArray,並從原陣列移除這些元素。$groupNum 次,每次用 array_slice 從 $firstArray 切出 $enum 個元素存入結果陣列 $result。$secondLength 個元素,依序加到 $result 的前幾組中,確保資料不遺失。$enum == 0(組數大於陣列長度),則每個元素獨立成一組。public function splitArray($array, $groupNum) {
if (empty($array)) return array();
$allLength = count($array);
$groupNum = intval($groupNum);
$start = 0;
$enum = (int)($allLength / $groupNum);
$result = array();
if ($enum > 0) {
$firstLength = $enum * $groupNum;
$firstArray = array();
for ($i = 0; $i < $firstLength; $i++) {
array_push($firstArray, $array[$i]);
unset($array[$i]);
}
for ($i = 0; $i < $groupNum; $i++) {
$result[] = array_slice($firstArray, $start, $enum);
$start += $enum;
}
$secondLength = $allLength - $firstLength;
for ($i = 0; $i < $secondLength; $i++) {
array_push($result[$i], $array[$i + $firstLength]);
}
} else {
for ($i = 0; $i < $allLength; $i++) {
$result[] = array_slice($array, $i, 1);
}
}
return $result;
}
$data = range(1, 10); // [1,2,3,4,5,6,7,8,9,10]
$groups = splitArray($data, 3);
// 結果:
// [
// [1, 2, 3, 10],
// [4, 5, 6],
// [7, 8, 9]
// ]
unset),若需保留原陣列請先複製。array_values 重置索引。這個函式提供了一種不依賴 array_chunk 的彈性分組方式,特別適合需要「盡量平均分配、餘數往前補」的業務場景。