1. 程式人生 > >回撥函式和陣列

回撥函式和陣列

array_filter用回撥函式過濾陣列中的單元

說明:arrayarray_filter(array$array[,[,int$flag= 0]] )

依次將array陣列中的每個值傳遞到callback函式。如果callback函式返回 true,則array陣列的當前值會被包含在返回的結果陣列中,否則,將不返回任何值給結果陣列。陣列的鍵名保留不變。

引數說明:

array:要迴圈的陣列

callback:使用的回撥函式

 如果沒有提供callback函式, 將刪除array中所有等值為FALSE的條目。

flag:決定callback接收的引數形式 

  • ARRAY_FILTER_USE_KEY-callback
    接受鍵名作為的唯一引數
  • ARRAY_FILTER_USE_BOTH-callback同時接受鍵名和鍵值

返回值:返回過濾後的陣列。

例子1:

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);
echo "Odd :\n";
print_r(array_filter(
$array1, "odd")); echo "<br />Even:\n"; print_r(array_filter($array2, "even")); 結果: Odd : Array ( [a] => 1 [c] => 3 [e] => 5 ) Even: Array ( [0] => 6 [2] => 8 [4] => 10 [6] => 12 )

分析:&是PHP的與運算,當陣列中的值傳遞進去,根據二進位制的形式和...0000 0001(前面多少個0和作業系統有關,不懂的去補補基礎知識)進行與運算,如果結果true,則把傳遞進來的值結果返回給結果陣列。

例2:沒有回撥函式,則陣列中的值為true,就把陣列中的值返回給結果陣列

$entry = array(
0 => 'foo',
1 => false,
2 => -1,
3 => null,
4 => ''
);
print_r(array_filter($entry));
結果:
Array ( [0] => foo [2] => -1 )

例3:如果只有鍵值,則回撥函式接收一個鍵值即可。如果同時包含鍵值對,第一個引數接收值,第二個值才接收鍵值

$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));
結果:
D:\studySoftware\wamp64\www\test.php:5:
array (size=1)
'b' => int 2
D:\studySoftware\wamp64\www\test.php:8:
array (size=2)
'b' => int 2
'd' => int 4
array_map為陣列的每個元素應用回撥函式

說明:arrayarray_map(,array$array1[,array$...] )

array_map():返回陣列,是為array1每個元素應用callback函式之後的陣列。callback函式形參的數量和傳給array_map()陣列數量,兩者必須一樣。

引數說明:

callback回撥函式,應用到每個數組裡的每個元素。

array1陣列,遍歷執行callback函式。

...陣列列表,每個都遍歷執行callback函式。

返回值:返回陣列,包含callback函式處理之後array1的所有元素。

例1:

function cube($n)
{
return($n * $n * $n);
}
$a = array(1, 2, 3, 4, 5);
$b = array_map("cube", $a);
print_r($b);
結果:
Array ( [0] => 1 [1] => 8 [2] => 27 [3] => 64 [4] => 125 )

例2:如果幾個陣列的元素數量不一致:空元素(null)會擴充套件短那個陣列,直到長度和最長的陣列一樣。

function cube($n,$x){
echo "n的值:{$n},x的值:{$x}<br />";
return ($n + $x);
}
$a = array(1,2,3,4,5);
$b = array(10,20);
$c = array_map("cube",$a,$b);
print_r($c);
/*
結果:
n的值:1,x的值:10
n的值:2,x的值:20
n的值:3,x的值:
n的值:4,x的值:
n的值:5,x的值:
Array ( [0] => 11 [1] => 22 [2] => 3 [3] => 4 [4] => 5 ) 
*/

例3:此函式有個有趣的用法:傳入NULL作為回撥函式的名稱,將建立多維陣列(一個數組,內部包含陣列。)

$a = array(1, 2, 3);
$b = array("one", "two", "three");
$c = array("uno", "dos", "tres");
$d = array_map(null, $a, $b, $c);
echo "<pre>";
print_r($d);
echo "</pre>";

結果如下:


例4:如果僅傳入一個數組,鍵(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_reduce用回撥函式迭代地將陣列簡化為單一的值

說明:mixedarray_reduce(array$array,[,mixed$initial=NULL] )

array_reduce()將回調函式callback迭代地作用到array