PHP對陣列的常用處理
print_r()
利用 print_r() 函式可以列印輸出整個陣列內容及結構,按照一定格式顯示鍵和元素。注意 print_r() 函式不僅是隻用於列印,實際它是用於列印關於變數的易於理解的資訊。
var_dump()
同 print_r() 函式一樣,var_dump() 函式也可以用於列印陣列的資料及結構。不過 var_dump() 函式功能比 print_r() 更強大,可以同時列印多個變數且給出變數的型別資訊。
print_r() 和 var_dump() 函式一般是用於除錯程式使用,更多情況是使用 echo 來輸出具體的陣列單元值。<?php $arr_age = array(18, 20, 25); var_dump($arr_age); ?> 輸出 array(3) { [0]=> int(18) [1]=> int(20) [2]=> int(25) }
is_array()
PHP is_array() 函式用於檢測變數是否是陣列,這個函式尤其會用於一些安全性檢查方面(如表單或 SESSION 檢查等)。
foreach()
PHP foreach() 語法結構用於遍歷操作或輸出陣列,foreach() 僅能用於遍歷陣列或物件,當試圖將其用於其它資料型別或者一個未初始化的變數時會產生錯誤。
語法:
foreach (array as $value) statement // 或者: foreach (array as $key => $value) statement
上述語法中,每次迴圈將當前單元的值賦給 $value 並且陣列內部的指標向前移一步。在第二種語法格式中還將當前單元的鍵名也會在每次迴圈中賦給變數 $key。
例子:
<?php $arr_age = array("wang"=>18, "li"=>20, "zhang"=>25); foreach ($arr_age as $age) { echo $age,'<br />'; } ?>
執行該例子輸出:
18 20 25
延伸預讀
PHP 陣列是通過雜湊表(HashTable)表實現的,因此 foreach 遍歷陣列時是依據元素新增的先後順序來進行的。如果想按照索引大小遍歷,應該使用 for() 迴圈遍歷。
提示
也可以用 list() 和 each() 結合來遍歷陣列,但測試發現效率不如 foreach() 。
array_sum()
PHP array_sum() 函式用於計算陣列中所有值的和,以整數或浮點數返回計算結果,非數字的單元將視作 0 。
array_product()
PHP array_product() 函式用於計算陣列中所有值的乘積,以整數或浮點數返回計算結果,非數字的單元將視作 0 。
array_count_values()
PHP array_count_values() 函式用於統計陣列中所有的值出現的次數,返回一個數組,其元素的鍵名是原陣列的值,鍵值是該值在原陣列中出現的次數。
in_array()
PHP in_array() 函式檢查陣列中是否存在某個值,如果存在則返回 TRUE ,否則返回 FALSE 。
語法:
bool in_array( mixed needle, array array [, bool strict] )
引數 | 說明 |
---|---|
needle | 需要在陣列中搜索的值,如果是字串,則區分大小寫 |
array | 需要檢索的陣列 |
strict | 可選,如果設定為 TRUE ,則還會對 needle 與 array 中的值型別進行檢查 |
例子:
<?php $arr_a = array("a", "b", "c", 1); if(in_array("a", $arr_a)){ echo '字元 a 在 $arr_a 陣列中存在'; } else { echo '字元 a 在 $arr_a 陣列中不存在'; } ?>
例子輸出結果如下:
字元 a 在 $arr_a 陣列中存在
嚴格檢查的例子:
<?php $arr_a = array("a", "b", "c", 1); if(in_array("1", $arr_a, TRUE)){ echo '字元 1 在 $arr_a 陣列中存在'; } else { echo '字元 1 在 $arr_a 陣列中不存在'; } ?>
例子輸出結果如下:
字元 1 在 $arr_a 陣列中不存在
陣列作為 needle 的例子:
<?php $arr_a = array(array("a", "b"), 1, 2); $arr_b = array("a", "b"); if(in_array($arr_b, $arr_a)){ echo '陣列 $arr_b 在 $arr_a 陣列中存在'; } else { echo '陣列 $arr_b 在 $arr_a 陣列中不存在'; } ?>
例子輸出結果如下:
陣列 $arr_b 在 $arr_a 陣列中存在
array_key_exists()
PHP array_key_exists() 函式用於檢查給定的鍵名或索引是否存在於陣列中,如果存在則返回 TRUE ,否則返回 FALSE 。
提示
array_key_exists() 函式對於值為 null 的陣列元素仍返回 TRUE。若要對陣列元素是否為 null 做檢查,請使用 isset()。
array_array()
PHP array_search() 函式用於在陣列中搜索給定的值,如果成功則返回相應的鍵名,否則返回 FALSE 。
語法:
mixed array_search( mixed needle, array array [, bool strict] )
引數 | 說明 |
---|---|
needle | 需要在陣列中搜索的值,如果是字串,則區分大小寫 |
array | 需要檢索的陣列 |
strict | 可選,如果設定為 TRUE ,則還會對 needle 與 array 中的值型別進行檢查 |
提示
由於索引陣列的起始索引數字可能是 0 ,因此該函式也可能返回與 FALSE 等值的非布林值,例如 0 或者 "",所以需要使用 === 運算子對函式返回的值進行嚴格校驗。
例子:
<?php $arr_a = array(0 => "a", 1 => "b", 2 => "c"); $key = array_search("a", $arr_a); if( $key !== FALSE ){ echo "鍵名為:$key"; } else { echo '無匹配結果'; } ?>
例子輸出結果如下:
鍵名為:0
如果 needle 在 array 中出現不止一次,則返回第一個匹配的鍵。要返回所有匹配值的鍵,請使用 array_keys() 函式。
參考閱讀
in_array():檢查陣列中是否存在某個值sort() 函式用於對陣列單元從低到高進行排序。rsort() 函式用於對陣列單元從高到低進行排序。asort() 函式用於對陣列單元從低到高進行排序並保持索引關係。arsort() 函式用於對陣列單元從高到低進行排序並保持索引關係。ksort() 函式用於對陣列單元按照鍵名從低到高進行排序。krsort() 函式用於對陣列單元按照鍵名從高到低進行排序。 natsort() 函式用於對陣列使用 自然演算法 進行排序。natcasesort() 函式用於對陣列使用 自然演算法 並不區分大小寫進行排序。
PHP sort() 函式用於對陣列單元從低到高進行排序,如果成功則返回 TRUE,失敗則返回 FALSE。
注意:本函式會為排序的陣列中的單元賦予新的鍵名,這將刪除原有的鍵名而不僅是重新排序。
語法:
bool sort( array &array [, int sort_flags] )
可選引數 sort_flags 用於改變排序的行為:
sort_flags 取值 | 說明 |
---|---|
SORT_REGULAR | 正常比較單元 |
SORT_NUMERIC | 單元被作為數字來比較 |
SORT_STRING | 單元被作為字串來比較 |
SORT_LOCALE_STRING | 根據當前的區域(locale)設定來把單元當作字串比較 |
例子:
<?php $arr = array("b", "a", "c"); sort($arr); print_r($arr); ?>
執行該例子輸出:
Array ( [0] => a [1] => b [2] => c )
在本例中, $arr 陣列單元被按照字母順序排序,而陣列單元經過排序後,鍵值重新分配。
natsort()
PHP natsort() 函式用於對陣列使用 自然演算法 進行排序,如果成功則返回 TRUE,失敗則返回 FALSE。
本函式實現了一個和人們通常對字母數字字串進行排序的方法一樣的排序演算法並保持原有鍵名和值的關聯。
語法:
bool natsort ( array &array )
natsort() 和 sort() 排序比較:
<?php $arr1 = $arr2 = array("a1", "a11", "a2"); sort($arr1); print_r($arr1); echo '<br />'; natsort($arr2); print_r($arr2); ?>
執行該例子輸出:
Array ( [0] => a1 [1] => a11 [2] => a2 ) Array ( [0] => a1 [2] => a2 [1] => a11 )
natcasesort()
natcasesort() 函式行為與 natsort() 函式完全一致,區別之處在於 natcasesort() 不對陣列單元區分大小寫。
array_multisort()
PHP array_multisort() 函式用於一次對多個數組進行排序,或者根據某一維或多維對多維陣列進行排序,如果成功則返回 TRUE,失敗則返回 FALSE。
注意:關聯(string)鍵名保持不變,但數字鍵名會被重新索引。
語法:
bool array_multisort( array1 [, sort_order][, sort_flags][, array2] ... )
array1 為必須引數,需要排序的陣列。可選引數 sort_order 和 sort_flags 意義如下:
sort_order 取值 | 說明 |
---|---|
SORT_ASC | 預設值,按照上升順序排序 |
SORT_DESC | 按照下降順序排序 |
sort_flags 取值 | 說明 |
---|---|
SORT_REGULAR | 預設值,按照通常方法比較 |
SORT_NUMERIC | 單元被作為數字來比較 |
SORT_STRING | 單元被作為字串來比較 |
每個陣列之後不能指定兩個同類的排序標誌,且每個陣列後指定的排序標誌僅對該陣列有效,如果缺少對應標誌將採用預設值。
輸入陣列被當成一個表的列並以行來排序,這類似於 SQL 的 ORDER BY 子句功能。第一個陣列是要排序的主要陣列,單元的值相同的話就按照下一個輸入陣列中相應值的大小來排序,依此類推。
例子1:
<?php $arr1 = array(1, 3, 2, 4); $arr2 = array("a", "b", "c", "d"); array_multisort($arr1, $arr2); print_r($arr1); print_r($arr2); ?>
執行該例子輸出:
Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 ) Array ( [0] => a [1] => c [2] => b [3] => d )
可見第一個主要陣列經過排序後,後面的陣列會受到第一個陣列的影響而保持對應關係。就上面的例子,哪怕給 arr2 加上 SORT_DESC (降序排列)引數,也不會影響到 arr2 的排序結果。這種影響在多維數組裡也存在。
例子2,主陣列單元值有同樣的情況:
<?php $arr1 = array(1, 2, 2, 4); $arr2 = array("a", "b", "c", "d"); array_multisort($arr1, SORT_DESC, $arr2, SORT_ASC); print_r($arr1); print_r($arr2); ?>
執行該例子輸出:
Array ( [0] => 4 [1] => 2 [2] => 2 [3] => 1 ) Array ( [0] => d [1] => b [2] => c [3] => a )
例子3,多維陣列排序:
<?php $arr = array (array (1, 2, 3, 4), array ("a", "b", "b", "d")); array_multisort($arr[0], SORT_DESC, $arr[1], SORT_ASC); print_r($arr); ?>
執行該例子輸出:
Array ( [0] => Array ( [0] => 4 [1] => 2 [2] => 2 [3] => 1 ) [1] => Array ( [0] => d [1] => b [2] => c [3] => a ) )
例子4,數字與字元混合:
<?php $arr = array (array ("11", 2, 2, "a"), array (1, 2, 3, 4)); array_multisort($arr[0], SORT_ASC, SORT_STRING, $arr[1], SORT_NUMERIC, SORT_DESC); var_dump($arr); ?>
執行該例子輸出:
array(2) { [0]=> array(4) { [0] => string(2) "11" [1] => int(2) [2] => int(2) [3] => string(1) "a" } [1]=> array(4) { [0] => int(1) [1] => int(3) [2] => int(2) [3] => int(4) } }
shuffle()
PHP shuffle() 函式隨機排列陣列單元的順序(將陣列打亂)。本函式為陣列中的單元賦予新的鍵名,這將刪除原有的鍵名而不僅是重新排序。
語法:
bool shuffle ( array &array )
例子1:
<?php $arr = range(1,8); print_r($arr); echo '<br />'; shuffle($arr); print_r($arr); ?>
執行該例子輸出:
Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 [5] => 6 [6] => 7 [7] => 8 ) Array ( [0] => 6 [1] => 1 [2] => 3 [3] => 2 [4] => 5 [5] => 7 [6] => 8 [7] => 4 )
需要說明的是,每次重新整理頁面,shuffle($arr) 後的 print_r($arr) 結果都是不一樣的。而自 PHP 4.2.0 起,也不再需要用 srand() 等函式給隨機數發生器播種而由系統自動完成。
例子2,使用關聯陣列:
<?php $arr = array("a"=>1, "b"=>2, "c"=>3, "d"=>4, "e"=>5); shuffle($arr); print_r($arr); ?>
執行該例子輸出:
Array ( [0] => 5 [1] => 2 [2] => 1 [3] => 3 [4] => 4 )
當然,每次重新整理頁面輸出的結果都是不一樣的。