gpt4 book ai didi

php - array_filter() 和 array_map() 之间的区别?

转载 作者:IT王子 更新时间:2023-10-29 00:06:37 26 4
gpt4 key购买 nike

我查看了 web 中的类似主题以及堆栈溢出,但我可以清楚地了解这个主题。 Difference between array_map, array_walk and array_filter

<?php
error_reporting(-1);

$arr = array(2.4, 2.6, 3.5);

print_r(array_map(function($a) {
$a > 2.5;
},$arr));

print_r(array_filter($arr, function($a){
return $a > 2.5;
}));

?>

上面的代码返回一个过滤后的数组,它的值> 2.5。我可以用 array_map 实现 array_filter 的功能吗?。

最佳答案

全部三个,array_filter , array_map , 和 array_walk ,使用回调函数以相同的方式遍历数组 foreach loops 遍历 $array使用 $key => $value对。
在这篇文章中,我将把传递给上述函数的原始数组称为 $array。 , 循环中当前项目的索引,如 $key ,以及循环中当前项目的值,如 $value .

array_filter 类似于 MySQL 的 SELECT 查询,它选择记录但不修改它们。
array_filter 的回调传递给 $value当前循环项和回调返回的任何内容都被视为 bool 值。
如果 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 传递,如 documentation 中所述:

If the array argument contains string keys then the returned array will contain string keys if and only if exactly one array is passed. If more than one argument is passed then the returned array always has integer keys

循环遍历第一个数组,并将其值作为第一个参数传递给回调,如果指定了第二个数组,它也将循环遍历,并将其值作为第二个参数发送给回调,依此类推-on 等每个附加参数。
如果数组的长度不匹配,则使用最大的数组,如 documentation 中所述:

Usually when using two or more arrays, they should be of equal length because the callback function is applied in parallel to the corresponding elements. If the arrays are of unequal length, shorter ones will be extended with empty elements to match the length of the longest.

每次调用回调时,都会收集返回值。只有在使用一个数组时才会保留键,array_map 返回结果数组。如果使用两个或更多数组,键将丢失,而是返回一个填充有回调结果的新数组。array_map 只向回调发送当前项目的 $value 而不是它的 $key。如果您还需要 key ,您可以将 array_keys($array) 作为附加参数传递,然后回调将同时接收 $key 和 $value。
但是,当使用多个数组时,原始键将以与 array_values 丢弃键大致相同的方式丢失。如果需要保留 key ,可以使用 array_keys从原始数组和 array_values 中获取键从 array_map 的结果中获取值, 或者只使用 array_map 的结果直接因为它已经返回值,然后使用 array_combine 将两者结合起来.

你可能会这样做:

<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 foreach($array as $key=>$value) 非常相似,因为回调会同时发送一个键和一个值。如果您想将第三个参数直接传递给回调,它也接受一个可选参数。
array_walk 返回一个 bool 值,指示循环是否成功完成。
(我还没有找到它的实际用途)
请注意,array_walk 不使用回调的返回值。由于 array_walk 返回一个 bool 值,为了让 array_walk 影响某些东西,您需要引用 &$value 以便您可以修改或使用全局数组。或者,如果您不想污染全局范围,array_walk 的可选第三个参数可用于传递对要写入的变量的引用。

你可能会这样做:

<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>

关于php - array_filter() 和 array_map() 之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19698954/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com