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

PHP 陣列進階合併:依分類 ID 重組多維陣列實戰

     編輯:PHP 相關知識

前言:基本陣列合併的陷阱

在 PHP 開發中,合併陣列是家常便飯。最直觀的 array_merge() 與 + 運算子雖然都能把多個陣列合成一個,但它們對「數字索引」與「字串索引」的處理邏輯截然不同,稍有不慎就會導致資料遺失或索引錯亂。

數字索引:array_merge() 會重新編排索引,+ 保留首次出現的值

$array1 = [1 => '0'];
$array2 = [1 => 'data'];

// + 運算子:保留左側陣列的值
$result1 = $array2 + $array1; // [1 => 'data']
$result2 = $array1 + $array2; // [1 => '0']

// array_merge:重新編排為 0, 1, 2...
$result3 = array_merge($array2, $array1); // [0 => 'data', 1 => '0']
$result4 = array_merge($array1, $array2); // [0 => '0', 1 => 'data']

字串索引:array_merge() 會覆蓋,+ 仍保留首次出現

$array1 = ['asd' => '0'];
$array2 = ['asd' => 'data'];

$result1 = $array2 + $array1; // ['asd' => 'data']
$result2 = $array1 + $array2; // ['asd' => '0']
$result3 = array_merge($array2, $array1); // ['asd' => '0'] 後者覆蓋前者
$result4 = array_merge($array1, $array2); // ['asd' => 'data']

實戰需求:依 CategoryID 將商品陣列分群

假設我們有一組商品資料,每筆包含 ItemID 與 CategoryID,目標是將相同分類的商品聚合在一起,形成以分類 ID 為鍵的多維陣列。

原始資料範例

$products = [
    ['ItemID' => 110126866896, 'CategoryID' => 111],
    ['ItemID' => 120126866896, 'CategoryID' => 112],
    ['ItemID' => 130126866896, 'CategoryID' => 113],
    ['ItemID' => 140126866896, 'CategoryID' => 114],
    ['ItemID' => 150126866896, 'CategoryID' => 115],
    ['ItemID' => 160126866896, 'CategoryID' => 116],
    ['ItemID' => 170126866896, 'CategoryID' => 117],
    ['ItemID' => 118126866896, 'CategoryID' => 111],  // 同分類 111
    ['ItemID' => 121126866896, 'CategoryID' => 112],  // 同分類 112
    // ... 更多資料
];

核心邏輯:單層 foreach 即可完成分群

$grouped = [];
foreach ($products as $item) {
    // 以 CategoryID 為鍵,將整筆商品資料推入對應的子陣列
    $grouped[$item['CategoryID']][] = $item;
}

// 釋放原始大陣列記憶體(可選,視資料量而定)
$products = null;
unset($products);

print_r($grouped);

輸出結構

Array
(
    [111] => Array
        (
            [0] => Array ( [ItemID] => 110126866896 [CategoryID] => 111 )
            [1] => Array ( [ItemID] => 118126866896 [CategoryID] => 111 )
        )
    [112] => Array
        (
            [0] => Array ( [ItemID] => 120126866896 [CategoryID] => 112 )
            [1] => Array ( [ItemID] => 121126866896 [CategoryID] => 112 )
        )
    // ... 其他分類
)

進階應用:搭配 array_column 或 array_map 進一步處理

若後續只需提取特定欄位(如只要 ItemID 清單),可配合 array_column:

$itemIdsByCategory = [];
foreach ($grouped as $catId => $items) {
    $itemIdsByCategory[$catId] = array_column($items, 'ItemID');
}

總結

  • 基本合併:array_merge() 適合重新索引、字串鍵覆蓋;+ 適合保留原鍵、優先首見值。
  • 分類重組:利用「鍵名動態建立子陣列」的寫法 $newArray[$key][] = $value,程式碼簡潔且效能優異,無需多層迴圈或複雜判斷。
  • 記憶體管理:處理大量資料時,及時 unset() 原始陣列能有效降低記憶體峰值。

掌握這些陣列操作細節,能讓資料整理邏輯更健壯、程式碼更易維護。

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