HOWTO · PHP
在 PHP 中推送元素到關聯陣列
在本教程中,我們將瞭解如何在 PHP 中將專案或元素新增到關聯陣列中。
本頁內容
若要在 PHP 關聯陣列中新增項目,請依照所需的鍵選擇操作:array_push() 會以數字鍵附加值;array_merge() 則可在指定的字串鍵下新增項目。若陣列含有相同的字串鍵,array_merge() 會保留後面的值;array_merge_recursive() 則會將重複鍵的值收集到陣列中。
下方的程式碼範例已執行成功,結果也符合接下來說明的行為。
PHP 中的關聯陣列是什麼?
PHP 陣列是有順序的映射結構:每個值都存放在整數鍵或字串鍵之下。因此,陣列可以作為清單、名稱與值的對照表,或同時兼具兩者。以字串作為鍵的陣列通常稱為關聯陣列。鍵可讓你依照意義而非位置取得值,例如下方的 $age['Mike']。
執行這個範例:
本節中的程式碼以及顯示的標籤或輸出仍為英文。
<?php
$age = ['Mike' => 24, 'Ann' => 19, 'Alice' => 32];
echo "Mike is {$age['Mike']} years old.";
這種結構適合用在每個值都有固定標籤的情況,例如姓名、產品 SKU 或設定選項。讀取項目時,請使用拼法相同的鍵;鍵有大小寫之分,因此 'Mike' 和 'mike' 代表不同項目。陣列可以同時包含字串鍵與整數鍵,所以新增值時所用的操作很重要。執行範例時,echo 會顯示英文句子 Mike is 24 years old.,也就是 Mike 24 歲。
使用 array_push() 附加值
array_push() 是一個函式,可將一個或多個值附加到陣列末端。PHP 會為附加的值指定整數鍵;這個函式無法讓你選擇 'c' 之類的字串鍵。若新值應加入數字序列,即使陣列已有具名項目,也可以使用它。若需要指定名稱,請改用下一節介紹的合併方式。
本節中的程式碼以及顯示的標籤或輸出仍為英文。
<?php
$color = ['a' => 'Red', 'b' => 'Blue'];
array_push($color, 'Green', 'White');
print_r($color);
兩個新值會依序附加並取得整數鍵,原有的字串鍵項目則會保留。若只新增一個值,$color[] = 'Green'; 是更簡潔且附加行為相同的寫法。這兩種方式都不會建立具名項目。如果後續程式需要依賴整數鍵,請檢查產生的鍵,不要假設陣列一定是從零開始的清單。
使用 array_merge() 新增具名項目
若要新增具名項目,先建立一個包含該鍵和值的小型關聯陣列,再將它與原陣列合併。回傳的陣列會包含兩個輸入陣列中的項目;將結果指定回變數即可更新變數,直接使用結果則不會改動原變數。
本節中的程式碼以及顯示的標籤或輸出仍為英文。
<?php
$age = ['Mike' => 24, 'Ann' => 19, 'Alice' => 19];
$age = array_merge($age, ['John' => 22]);
print_r($age);
在此,'John' 仍是字串鍵,因此可以透過 $age['John'] 取得。你可以傳入兩個以上的陣列,而陣列順序會影響結果。若字串鍵重複,後面陣列中的值會取代前面的值。例如,將 ['b' => 'Blue'] 與 ['b' => 'Neon'] 合併後,結果會保留 'b' => 'Neon'。當後續設定需要覆蓋預設值時,這種取代行為很有用,但該鍵原本的值會被丟棄。
整數鍵則有不同規則:array_merge() 會依照遇到鍵的順序,將結果中的數字鍵重新編號,從零開始。因此,若必須保留原本的整數鍵,就不要使用這個函式。若只是新增具名項目,也可以使用 + 陣列聯集運算子;它會保留鍵,且重複鍵會採用左側的值。只有在這種優先順序符合需求時才使用它。
使用 array_merge_recursive() 處理重複的字串鍵
若希望重複字串鍵的值都保留下來,array_merge_recursive() 會將這些值合併到該鍵下的一個陣列中。這與會取代先前值的 array_merge() 不同,也會改變值的結構:原本預期 $color['b'] 是字串的程式碼,現在必須改為處理陣列。只有在需要將值分組時才使用這個函式,不要把它當成一般合併操作的直接替代方案。
本節中的程式碼以及顯示的標籤或輸出仍為英文。
<?php
$color = ['a' => 'Red', 'b' => 'Blue'];
$otherColor = ['b' => 'Neon', 'c' => 'Green'];
$result = array_merge_recursive($color, $otherColor);
print_r($result);
結果中的 'a' 和 'c' 仍是單一值,而 'b' 則在索引陣列中同時包含 'Blue' 和 'Neon'。如果重複鍵原本存放的是陣列,遞迴合併也可能合併其中的巢狀值;因此,在把結果當成純量使用之前,請先檢查其結構。簡言之,使用 array_push() 附加帶有數字鍵的值,使用 array_merge() 新增具名項目並讓後值取代前值;只有在確實需要合併重複值,且接受結果形成巢狀結構時,才使用 array_merge_recursive()。