在 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() 原始陣列能有效降低記憶體峰值。掌握這些陣列操作細節,能讓資料整理邏輯更健壯、程式碼更易維護。