PHP中的數組功能非常強大,數組處理函數有著強大、靈活、高效的特點。PHP5提供了近100個操作數組的系統函數,包括排序函數、替換函數、數組計算函數等。下面將詳細介紹數組函數
[注意]關於javascript數組的22種方法移步至此
數組的每個元素都是由鍵值對組成,通過元素的鍵名來訪問對應的鍵值。關於鍵值操作有array_values()、array_keys()、in_array()、array_flip()和array_reverse()這5個常用函數
array_values
array_values() 返回 input 數組中所有的值並給其建立數字索引
array array_values ( array $input )
<?php $array = array("size" => "XL", "color" => "gold"); //Array ( [0] => XL [1] => gold ) print_r(array_values($array)); ?>
array_keys
array_keys() 返回 input 數組中的數字或者字符串的鍵名
array array_keys ( array $array [, mixed $search_value [, bool $strict = false ]] )
如果指定了可選參數 search_value,則只返回該值的鍵名。否則 input 數組中的所有鍵名都會被返回
如果指定了可選參數 strict,表示判斷在搜索的時候是否該使用嚴格的比較(===)
<?php $array = array(0 => 100, "color" => "red"); //Array ( [0] => 0 [1] => color ) print_r(array_keys($array)); $array = array("blue", "red", "green", "blue", "blue"); // Array ( [0] => 0 [1] => 3 [2] => 4 ) print_r(array_keys($array, "blue")); $array = array("color" => array("blue", "red", "green"), "size" => array("small", "medium", "large")); Array ( [0] => color [1] => size ) print_r(array_keys($array)); ?>
in_array
in_array — 檢查數組中是否存在某個值
bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] )
如果第三個參數 strict 的值為 TRUE 則 in_array() 函數還會檢查 needle 的類型是否和 haystack 中的相同
<?php $os = array("Mac", "NT", "Irix", "Linux"); if (in_array("Irix", $os)) { //Got Irix echo "Got Irix"; } if (in_array("mac", $os)) { echo "Got mac"; } ?>
array_flip
array_flip — 交換數組中的鍵和值,成功時返回交換後的數組,如果失敗返回 NULL
array array_flip ( array $trans )
array_flip() 返回一個反轉後的 array,例如 trans 中的鍵名變成了值,而 trans 中的值成了鍵名
如果同一個值出現了多次,則最後一個鍵名將作為它的值,所有其它的都丟失了
[注意]trans中的值需要能夠作為合法的鍵名,例如需要是 integer 或者 string。如果值的類型不對將發出一個警告,並且有問題的鍵/值對將不會反轉
<?php $trans = array("a" => 1, "b" => 1, "c" => 2); $trans = array_flip($trans); //Array ( [1] => b [2] => c ) print_r($trans); ?>
array_reverse
array_reverse — 返回一個單元順序相反的數組
array array_reverse ( array $array [, bool $preserve_keys = false ] )
如果參數preserve_keys設置為 TRUE 會保留數字的鍵。非數字的鍵則不受這個設置的影響,總是會被保留
<?php $input = array("php", 4.0, array("green", "red")); $result = array_reverse($input); /* array (size=3) 0 => array (size=2) 0 => string 'green' (length=5) 1 => string 'red' (length=3) 1 => float 4 2 => string 'php' (length=3) */ var_dump($result); $result_keyed = array_reverse($input, true); /* array (size=3) 2 => array (size=2) 0 => string 'green' (length=5) 1 => string 'red' (length=3) 1 => float 4 0 => string 'php' (length=3) */ var_dump($result_keyed); ?>
count
count — 計算數組中的單元數目或對象中的屬性個數
int count ( mixed $var [, int $mode = COUNT_NORMAL ] )
如果可選的 mode 參數設為 COUNT_RECURSIVE(或 1),count() 將遞歸地對數組計數。對計算多維數組的所有單元尤其有用。mode 的默認值是 0。count() 識別不了無限遞歸
<?php $a[0] = 1; $a[1] = 3; $a[2] = 5; $result = count($a); // $result == 3 $b[0] = 7; $b[5] = 9; $b[10] = 11; $result = count($b); // $result == 3 $result = count(null); // $result == 0 $result = count(false); // $result == 1 ?>
<?php $food = array('fruits' => array('orange', 'banana', 'apple'), 'veggie' => array('carrot', 'collard', 'pea')); echo count($food, COUNT_RECURSIVE); // output 8 echo count($food); // output 2 ?>
array_count_values
array_count_values — 統計數組中所有的值出現的次數
array array_count_values ( array $input )
<?php $array = array(1, "hello", 1, "world", "hello"); //Array ( [1] => 2 [hello] => 2 [world] => 1 ) print_r(array_count_values($array)); ?>
array_unique
array_unique — 移除數組中重復的值
array array_unique ( array $array [, int $sort_flags = SORT_STRING ] )
[注意]鍵名保留不變。array_unique() 先將值作為字符串排序,然後對每個值只保留第一個遇到的鍵名,接著忽略所有後面的鍵名。這並不意味著在未排序的 array 中同一個值的第一個出現的鍵名會被保留
<?php $input = array("a" => "green", "red", "b" => "green", "blue", "red"); $result = array_unique($input); //Array ( [a] => green [0] => red [1] => blue ) print_r($result); ?>
array_sum
array_sum — 計算數組中所有值的和
array_sum() 將數組中的所有值的和以整數或浮點數的結果返回
<?php $a = array(2, 4, 6, 8); //sum(a) = 20 echo "sum(a) = " . array_sum($a) . "\n"; $b = array("a" => 1.2, "b" => 2.3, "c" => 3.4); //sum(b) = 6.9 echo "sum(b) = " . array_sum($b) . "\n"; ?>
array_filter
array_filter — 用回調函數過濾數組中的單元
array array_filter ( array $array [, callable $callback [, int $flag = 0 ]] )
依次將 array 數組中的每個值傳遞到 callback 函數。如果 callback 函數返回 TRUE,則 input 數組的當前值會被包含在返回的結果數組中。數組的鍵名保留不變
[注意]如果沒有提供 callback 函數, 將刪除 input 中所有等值為 FALSE 的條目
<?php $entry = array(0 => 'foo',1 => false,2 => -1,3 => null,4 => ''); //Array ( [0] => foo [2] => -1 ) print_r(array_filter($entry)); ?>
<?php function odd($var) { return($var & 1); } function even($var) { return(!($var & 1)); } $array1 = array("a"=>1, "b"=>2, "c"=>3, "d"=>4, "e"=>5); $array2 = array(6, 7, 8, 9, 10, 11, 12); //Odd : Array ( [a] => 1 [c] => 3 [e] => 5 ) echo "Odd :\n"; print_r(array_filter($array1, "odd")); //Even: Array ( [0] => 6 [2] => 8 [4] => 10 [6] => 12 ) echo "Even:\n"; print_r(array_filter($array2, "even")); ?>
array_walk
array_walk — 使用用戶自定義函數對數組中的每個元素做回調處理
bool array_walk ( array &$array , callable $callback [, mixed $userdata = NULL ] )
將用戶自定義函數 funcname 應用到 array 數組中的每個單元。array_walk() 不會受到 array 內部數組指針的影響。array_walk() 會遍歷整個數組而不管指針的位置
典型情況下 callback 接受兩個參數。array 參數的值作為第一個,鍵名作為第二個
如果提供了可選參數 userdata,將被作為第三個參數傳遞給 callback funcname
<?php $fruits = array("d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple"); function test_alter(&$item1, $key, $prefix) { $item1 = "$prefix: $item1"; } function test_print($item2, $key) { echo "$key. $item2\n"; } //Before ...: d. lemon a. orange b. banana c. apple echo "Before ...:\n"; array_walk($fruits, 'test_print'); array_walk($fruits, 'test_alter', 'fruit'); echo "... and after:\n"; //... and after: d. fruit: lemon a. fruit: orange b. fruit: banana c. fruit: apple array_walk($fruits, 'test_print'); ?>
array_map
array_map — 將回調函數作用到給定數組的單元上
array array_map ( callable $callback , array $arr1 [, array $... ] )
array_map() 返回一個數組,該數組包含了 arr1 中的所有單元經過 callback 作用過之後的單元。callback 接受的參數數目應該和傳遞給 array_map() 函數的數組數目一致
<?php function cube($n) { return($n * $n * $n); } $a = array(1, 2, 3, 4, 5); $b = array_map("cube", $a); //Array ( [0] => 1 [1] => 8 [2] => 27 [3] => 64 [4] => 125 ) print_r($b); ?>
array_slice
array_slice — 從數組中取出一段
array array_slice ( array $array , int $offset [, int $length = NULL [, bool $preserve_keys = false ]] )
array_slice() 返回根據 offset 和 length 參數所指定的 array 數組中的一段序列
[注意]array_slice()默認會重新排序並重置數組的數字索引。可以通過將 preserve_keys 設為 TRUE 來改變此行為
<?php $input = array("a", "b", "c", "d", "e"); // returns "c", "d", and "e" $output = array_slice($input, 2); // returns "d" $output = array_slice($input, -2, 1); // returns "a", "b", and "c" $output = array_slice($input, 0, 3); //Array ( [0] => c [1] => d ) print_r(array_slice($input, 2, -1)); //Array ( [2] => c [3] => d ) print_r(array_slice($input, 2, -1, true)); ?>
array_splice
array_splice — 把數組中的一部分去掉並用其它值取代,返回一個包含有被移除單元的數組,而原數組為變化後的數組
array array_splice ( array &$input , int $offset [, int $length = 0 [, mixed $replacement ]] )
把 input 數組中由 offset 和 length 指定的單元去掉,如果提供了 replacement 參數,則用其中的單元取代
[注意]input 中的數字鍵名不被保留
<?php $input = array("red", "green", "blue", "yellow"); print_r(array_splice($input, 2));//Array ( [0] => blue [1] => yellow ) print_r($input);//Array ( [0] => red [1] => green ) $input = array("red", "green", "blue", "yellow"); print_r(array_splice($input, -1, 1, array("black", "maroon")));// Array ( [0] => yellow ) print_r($input);//Array ( [0] => red [1] => green [2] => blue [3] => black [4] => maroon ) ?>
array_combine
array_combine — 創建一個數組,用一個數組的值作為其鍵名,另一個數組的值作為其值
array array_combine ( array $keys , array $values )
[注意]如果作為keys的數組和作為values的數組的元素個數不一樣,將會拋出一個警告錯誤
<?php $a = array('green', 'red', 'yellow'); $b = array('avocado', 'apple', 'banana'); $c = array_combine($a, $b); //Array ( [green] => avocado [red] => apple [yellow] => banana ) print_r($c); ?>
array_merge
array_merge — 合並一個或多個數組
array array_merge ( array $array1 [, array $... ] )
array_merge() 將一個或多個數組的單元合並起來,一個數組中的值附加在前一個數組的後面。返回作為結果的數組
如果輸入的數組中有相同的字符串鍵名,則該鍵名後面的值將覆蓋前一個值。然而,如果數組包含數字鍵名,後面的值將不會覆蓋原來的值,而是附加到後面
如果只給了一個數組並且該數組是數字索引的,則鍵名會以連續方式重新索引
<?php $array1 = array("color" => "red", 2, 4); $array2 = array("a", "b", "color" => "green", "shape" => "trapezoid", 4); $result = array_merge($array1, $array2); //Array ( [color] => green [0] => 2 [1] => 4 [2] => a [3] => b [shape] => trapezoid [4] => 4 ) print_r($result); ?>
【+】
如果想完全保留原有數組並只想新的數組附加到後面,用 + 運算符
[注意]如果輸入的數組中有相同的字符串鍵名,則該鍵名前面的值將覆蓋後面的值
<?php $array1 = array(0 => 'zero_a', 2 => 'two_a', 3 => 'three_a'); $array2 = array(1 => 'one_a', 2 => 'three_a', 3 => 'four_a'); $result = $array1 + $array2; //Array ( [0] => zero_a [2] => two_a [3] => three_a [1] => one_a ) print_r($result); ?>
array_intersect
array_intersect — 計算數組的交集
array array_intersect ( array $array1 , array $array2 [, array $ ... ] )
array_intersect() 返回一個數組,該數組包含了所有在 array1 中也同時出現在所有其它參數數組中的值
[注意]鍵名保留不變
<?php $array1 = array("a" => "green", "red", "blue"); $array2 = array("b" => "green", "yellow", "red"); $result = array_intersect($array1, $array2); //Array ( [a] => green [0] => red ) print_r($result); ?>
array_diff
array_diff — 計算數組的差集
array array_diff ( array $array1 , array $array2 [, array $... ] )
對比返回在 array1 中但是不在 array2 及任何其它參數數組中的值
<?php $array1 = array("a" => "green", "red", "blue", "red"); $array2 = array("b" => "green", "yellow", "red"); $result = array_diff($array1, $array2); //Array ( [1] => blue ) print_r($result); ?>
array_fill
array_fill — 用給定的值填充數組,返回填充後的數組
array array_fill ( int $start_index , int $num , mixed $value )
array_fill() 用 value 參數的值將一個數組填充 num 個條目,鍵名由 start_index 參數指定的開始
?php $a = array_fill(5, 6, 'banana'); $b = array_fill(-2, 4, 'pear'); //Array ( [5] => banana [6] => banana [7] => banana [8] => banana [9] => banana [10] => banana ) print_r($a); //Array ( [-2] => pear [0] => pear [1] => pear [2] => pear ) print_r($b); ?>
range
range — 建立一個包含指定范圍單元的數組,返回的數組中從 start 到 limit 的單元,包括它們本身
array range ( mixed $start , mixed $limit [, number $step = 1 ] )
如果給出了 step 的值,它將被作為單元之間的步進值。step 應該為正值。如果未指定,step 則默認為 1
<?php // array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12) foreach (range(0, 12) as $number) { echo $number; } // array(0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100) foreach (range(0, 100, 10) as $number) { echo $number; } // array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'); foreach (range('a', 'i') as $letter) { echo $letter; } // array('c', 'b', 'a'); foreach (range('c', 'a') as $letter) { echo $letter; } ?>
array_pop
array_pop — 將數組最後一個單元彈出(出棧)
mixed array_pop ( array &$array )
array_pop() 彈出並返回 array 數組的最後一個單元,並將數組 array 的長度減一。如果 array 為空(或者不是數組)將返回 NULL
<?php $stack = array("orange", "banana", "apple", "raspberry"); $fruit = array_pop($stack); //Array ( [0] => orange [1] => banana [2] => apple ) print_r($stack); ?>
array_push
array_push — 將一個或多個單元壓入數組的末尾(入棧),返回處理之後數組的元素個數
int array_push ( array &$array , mixed $var [, mixed $... ] )
array_push() 將 array 當成一個棧,並將傳入的變量壓入 array 的末尾。array 的長度將根據入棧變量的數目增加
<?php $stack = array("orange", "banana"); array_push($stack, "apple", "raspberry"); //Array ( [0] => orange [1] => banana [2] => apple [3] => raspberry ) print_r($stack); ?>
array_shift
array_shift — 將數組開頭的單元移出數組
mixed array_shift ( array &$array )
array_shift() 將 array 的第一個單元移出並作為結果返回,將 array 的長度減一並將所有其它單元向前移動一位。所有的數字鍵名將改為從零開始計數,文字鍵名將不變
<?php $stack = array("orange", "banana", "apple", "raspberry"); $fruit = array_shift($stack); //Array ( [0] => banana [1] => apple [2] => raspberry ) print_r($stack); ?>
array_unshift
array_unshift — 在數組開頭插入一個或多個單元,返回 array 數組新的單元數目
int array_unshift ( array &$array , mixed $var [, mixed $... ] )
array_unshift() 將傳入的單元插入到 array 數組的開頭。注意單元是作為整體被插入的,因此傳入單元將保持同樣的順序。所有的數值鍵名將修改為從零開始重新計數,所有的文字鍵名保持不變
<?php $queue = array("orange", "banana"); array_unshift($queue, "apple", "raspberry"); //Array ( [0] => apple [1] => raspberry [2] => orange [3] => banana ) print_r($queue); ?>
array_rand
array_rand — 從數組中隨機取出一個或多個單元,並返回隨機條目的一個或多個鍵
mixed array_rand ( array $input [, int $num_req = 1 ] )
[注意]如果只取出一個,array_rand() 返回一個隨機單元的鍵名,否則就返回一個包含隨機鍵名的數組
<?php $input = array("Neo", "Morpheus", "Trinity", "Cypher", "Tank"); $rand_keys = array_rand($input, 2); //Neo echo $input[$rand_keys[0]] . "\n"; //Cypher echo $input[$rand_keys[1]] . "\n"; ?>
shuffle
shuffle — 將數組打亂,成功時返回 TRUE, 或者在失敗時返回 FALSE
bool shuffle ( array &$array )
<?php $numbers = range(1, 20); shuffle($numbers); //20 11 19 4 7 13 16 8 12 1 9 6 15 3 2 18 10 14 17 5 foreach ($numbers as $number) { echo "$number "; } ?>