(PHP 4 >= 4.0.6, PHP 5, PHP 7) array_filter — 用回調函數過濾數組中的單元。(返回回調函數中返回true的元素,也就是過濾掉返回false的元素)數組
array_filter ( array $array [, callable $callback [, int $flag = 0 ]] ) : array
若是沒有提供 callback 函數, 將刪除 array 中全部等值爲 FALSE 的條目。更多信息見轉換爲布爾值。函數
flag: 決定callback接收的參數形式:code
ARRAY_FILTER_USE_KEY - callback接受鍵名做爲的惟一參數three
ARRAY_FILTER_USE_BOTH -ci
返回過濾後的數組。input
獲取數組中的奇數偶數回調函數
//奇數 function odd($var) { // returns whether the input integer is odd return($var & 1); } //偶數 function even($var) { // returns whether the input integer is even return(!($var & 1)); } $array1 = array("a"=>1, "b"=>2, "c"=>3, "d"=>4, "e"=>5); $array2 = array(6, 7, 8, 9, 10, 11, 12); echo "Odd :\n"; print_r(array_filter($array1, "odd")); echo "Even:\n"; print_r(array_filter($array2, "even"));``
採用位運算, 1的二進制比較特殊:最後一位偉1,其餘位都爲0,用位異或和1計算,因爲1的其餘位都是0,就看另一個數的最後1位是0仍是1,若是是0,則和1的最後一位&計算獲得的0,不然是1。string
和 1 進行 & 運算的巧用,由於1的除了最後一位是1外,其餘位置都是0,因此任何一個數字和1進行&運算,結果只有2種,要麼是1,要麼是0,由進行比較的數字的最後一位決定(因爲1的其餘位都是0,因此對位&計算後確定是0)io
若是沒有提供 callback 函數, 將刪除 array 中全部等值爲 FALSE 的條目。function
$entry = array( 0 => 'foo', 1 => false, 2 => -1, 3 => null, 4 => '' ); print_r(array_filter($entry));
$arr = ['a' => 1, 'b' => 2, 'c' => 3, 'd' => 4]; //只使用單個的鍵 var_dump(array_filter($arr, function($k) { return $k == 'b'; }, ARRAY_FILTER_USE_KEY)); //是用數組的值和鍵 var_dump(array_filter($arr, function($v, $k) { return $k == 'b' || $v == 4; }, ARRAY_FILTER_USE_BOTH));
若是不用 flag 參數,而且function($v){},參數只有一個,是數組的值。因此回調函數中,能夠單個使用key,單個使用value,同時使用key和value。
(PHP 4 >= 4.0.6, PHP 5, PHP 7)
array_map — 爲數組的每一個元素應用回調函數
array_map ( callable $callback , array $array1 [, array $... ] ) : array
array_map():返回數組,是爲 array1 每一個元素應用 callback函數以後的數組。 callback 函數形參的數量和傳給 array_map() 數組數量,二者必須同樣
返回數組,包含 callback 函數處理以後 array1 的全部元素。
//全局函數 function cube($n) { return($n * $n * $n); } $a = array(1, 2, 3, 4, 5); $b = array_map("cube", $a); //匿名函數 $func = function($value) { return $value * 2; }; print_r(array_map($func, range(1, 5)));
function show_Spanish($n, $m) { return("The number $n is called $m in Spanish"); } $a = array(1, 2, 3, 4, 5); $b = array("uno", "dos", "tres", "cuatro", "cinco"); $c = array_map("show_Spanish", $a, $b); print_r($c);
傳入兩個及以上的數組時,它們元素數量將會相同。由於回調函數會並行地處理相互對應的元素。 若是幾個數組的元素數量不一致:空元素會擴展短那個數組,直到長度和最長的數組同樣。
此函數有個有趣的用法:傳入 NULL 做爲回調函數的名稱,將建立多維數組(一個數組,內部包含數組。)
$a = array(1, 2, 3, 4, 5); $b = array("one", "two", "three", "four", "five"); $c = array("uno", "dos", "tres", "cuatro", "cinco"); $d = array_map(null, $a, $b, $c); print_r($d);``
以上例程會輸出:
Array ( [0] => Array ( [0] => 1 [1] => one [2] => uno ) [1] => Array ( [0] => 2 [1] => two [2] => dos ) [2] => Array ( [0] => 3 [1] => three [2] => tres ) [3] => Array ( [0] => 4 [1] => four [2] => cuatro ) [4] => Array ( [0] => 5 [1] => five [2] => cinco ) )
若是僅傳入一個數組,鍵(key)會保留;傳入多個數組,鍵(key)是整型數字的序列。
arr = array("stringkey" => "value"); function cb1($a) { return array ($a); } function cb2($a, $b) { return array ($a, $b); } var_dump(array_map("cb1", $arr)); var_dump(array_map("cb2", $arr, $arr)); var_dump(array_map(null, $arr)); var_dump(array_map(null, $arr, $arr)); ?>
以上例程會輸出:
array(1) { ["stringkey"]=> array(1) { [0]=> string(5) "value" } } array(1) { [0]=> array(2) { [0]=> string(5) "value" [1]=> string(5) "value" } } array(1) { ["stringkey"]=> string(5) "value" } array(1) { [0]=> array(2) { [0]=> string(5) "value" [1]=> string(5) "value" } }