重新認識php array_merge函數
今天因一個Bug重新審視了下array_merge()這個函數。
定義:array_merge — 合并一個或多個數組
規範:array array_merge(array $array1 [, array $...])
說明:
1. 將一個或多個數組的單元合并起來,一個數組中的值附加在前一個數組的後面。
2. 如果輸入的數組中有相同的字串鍵名,則該鍵名後面的值將覆蓋前一個值。然而,如果數組包含數字鍵名,後面的值將不會覆蓋原來的值,而是附加到後面。
3. 如果只給了一個數組並且該數組是數字索引的,則鍵名會以連續方式重新索引。
這個函數在手冊中有詳盡樣本,用途也很廣且實用。
今天遇到的一個問題是手冊中有警告的,只是此前沒注意到,導致了一個致命的錯誤。如下:
PHP >= 5.0 版本,array_merge() 只接受array類型的參數。不過可以用強制轉換來合并其它類型。
對於是foreach等代碼產生的陣列變數要注意了,要麼初始化該變數為空白數組,要麼就在合并時做個強制轉換。不然,會有大苦頭吃。因此,保持一個初始設定變數的習慣也是個好事。
PHP中合并數組分成兩種情況
1、如果這兩個數組中有相同的字串鍵名:
<?php $book1 = array('linux'=>'linux伺服器配置與管理','php'=>'PHP程式設計'); $book2 = array('linux'=>'伺服器配置與管理','jsp'=>'PHP'); $result = array_merge($book1,$book2); print_r($result);?>
輸出為:
Array ( [linux] => 伺服器配置與管理 [php] => PHP程式設計 [jsp] => PHP )
說明,後者將替換前者。但如果使用的是array_merge_recursive()則可保留,並作一個子數組存在。如:
<?php $book1 = array('linux'=>'linux伺服器配置與管理','php'=>'PHP程式設計'); $book2 = array('linux'=>'伺服器配置與管理','jsp'=>'PHP'); $result = array_merge_recursive($book1,$book2); print_r($result);?>
輸出為:
Array ( [linux] => Array ( [0] => linux伺服器配置與管理 [1] => 伺服器配置與管理 ) [php] => PHP程式設計 [jsp] => PHP )
2、如果這兩個數組中有相同的數值鍵名:
<?php $book1 = array('linux伺服器配置與管理','PHP程式設計'); $book2 = array('伺服器配置與管理','PHP'); $result = array_merge($book1,$book2); print_r($result);?>
結果是:
Array ( [0] => linux伺服器配置與管理 [1] => PHP程式設計 [2] => 伺服器配置與管理 [3] => PHP )
這時,如果數組中包含相同的數字鍵名,則後面的不會覆蓋前面的值,而是後面的索引值按順序依次增加,附在後邊。明白了嗎,^_^