首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 將陣列按指定數量分組的實作方法

     編輯:PHP 相關知識

在 PHP 開發中,經常需要將一個大陣列拆分成多個固定大小的小陣列,例如分頁處理、批次資料匯入或平行運算時。本文介紹一個實用的 splitArray 函式,能依指定組數將陣列平均分配,並妥善處理餘數元素。

核心邏輯解析

函式接受兩個參數:$array 為待分割陣列,$groupNum 為目標組數。執行流程如下:

  1. 若陣列為空,直接回傳空陣列。
  2. 計算總長度 $allLength,並將 $groupNum 轉為整數。
  3. 算出每組基礎元素數 $enum = (int)($allLength / $groupNum)。
  4. 若 $enum > 0,先取出可整除的部分 $firstLength = $enum * $groupNum,建立暫存陣列 $firstArray,並從原陣列移除這些元素。
  5. 迴圈 $groupNum 次,每次用 array_slice 從 $firstArray 切出 $enum 個元素存入結果陣列 $result。
  6. 將剩餘的 $secondLength 個元素,依序加到 $result 的前幾組中,確保資料不遺失。
  7. 若 $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 的彈性分組方式,特別適合需要「盡量平均分配、餘數往前補」的業務場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved