所有三个array_filter、array_map和array_walk都使用回调函数来循环访问数组,就像 foreach 循环使用 $key = > $value对循环遍历$array一样。
在本文的持续时间内,我将引用原始数组,该数组传递给上述函数,如$array,循环中当前项目的索引,$key,以及循环中当前项的值,如$value。
array_filter类似于MySQL的SELECT查询,SELECTs记录但不修改它们。
array_filter的回调传递到当前循环项的$value,并且回调返回的任何内容都被视为布尔值。
如果为 true,则该项将包含在结果中。
如果为 false,则从结果中排除该项目。
因此,您可以执行以下操作:
<pre><?php
$users=array('user1'=>array('logged_in'=>'Y'),'user2'=>array('logged_in'=>'N'),'user3'=>array('logged_in'=>'Y'),'user4'=>array('logged_in'=>'Y'),'user5'=>array('logged_in'=>'N'));
function signedIn($value)
{
if($value['logged_in']=='Y')return true;
return false;
}
$signedInUsers=array_filter($users,'signedIn');
print_r($signedInUsers);//Array ( [user1] => Array ( [logged_in] => Y ) [user3] => Array ( [logged_in] => Y ) [user4] => Array ( [logged_in] => Y ) )
?></pre>
另一方面,array_map接受多个数组作为参数。如果指定了一个数组,则循环中当前项$value将发送到回调。如果使用两个或多个数组,则需要首先通过array_values传递所有数组,如文档中所述:
如果数组参数包含字符串键,则当且仅当传递了一个数组时,返回的数组将包含字符串键。如果传递了多个参数,则返回的数组始终具有整数键
第一个数组被循环通过,其值作为其第一个参数传递给回调,如果指定了第二个数组,它也将被循环通过,其值将作为第二个参数发送到回调,依此类推,每个附加参数依此类推。
如果数组的长度不匹配,则使用最大的数组,如文档中所述:
通常,当使用两个或多个数组时,它们的长度应相等,因为回调函数是并行应用于相应的元素的。如果数组的长度不相等,则较短的数组将使用空元素进行扩展,以匹配最长数组的长度。
每次调用回调时,都会收集返回值。仅当使用一个数组时,才会保留键,并且 array_map 返回结果数组。如果使用两个或多个数组,则键将丢失,而是返回一个用回调结果填充的新数组。array_map仅向回调发送当前项的$value,而不是其$key。如果您还需要密钥,则可以作为附加参数传递,然后回调将同时接收$key和$value。
但是,当使用多个数组时,原始密钥将以与array_values丢弃密钥的方式大致相同。如果需要保留键,可以使用array_keys从原始数组中获取键,array_values从array_map的结果中获取值,或者直接使用array_map的结果,因为它已经返回值,然后使用array_combine将两者结合起来。array_keys($array)
因此,您可以执行以下操作:
<pre><?php
$array=array('apple'=>'a','orange'=>'o');
function fn($key,$value)
{
return $value.' is for '.$key;
}
$result=array_map('fn',array_keys($array),$array);
print_r($result);//Array ( [0] => a is for apple [1] => o is for orange )
print_r(array_combine(array_keys($array),$result));//Array ( [apple] => a is for apple [orange] => o is for orange )
?></pre>
array_walk与回调非常相似,因为回调同时发送键和值。如果要将第三个参数直接传递给回调,它还接受可选参数。
array_walk返回一个布尔值,该值指示循环是否成功完成。
(我还没有找到它的实际用途)
请注意,array_walk不利用回调的返回。由于array_walk返回一个布尔值,因此为了使array_walk影响某些内容,您需要引用 &$value 以便拥有要修改或使用全局数组的内容。或者,如果不想污染全局范围,则可以使用array_walk可选的第 3rd 参数传入对要写入的变量的引用。foreach($array as $key=>$value)
因此,您可以执行以下操作:
<pre><?php
$readArray=array(1=>'January',2=>'February',3=>'March',4=>'April',5=>'May',6=>'June',7=>'July',8=>'August',9=>'September',10=>'October',11=>'November',12=>'December');
$writeArray=array();
function fn($value,$key,&$writeArray)
{
$writeArray[$key]=substr($value,0,3);
}
array_walk($readArray,'fn',&$writeArray);
print_r($writeArray);//Array ( [1] => Jan [2] => Feb [3] => Mar [4] => Apr [5] => May [6] => Jun [7] => Jul [8] => Aug [9] => Sep [10] => Oct [11] => Nov [12] => Dec )
?></pre>