array_map
、array_walk
和array_filter
之间到底有什么区别。我从文档中可以看到,您可以传递一个回调函数来对所提供的数组执行操作。但我似乎没有发现它们之间有什么特别的区别。
他们会做同样的事情吗?
它们可以互换使用吗?
如果它们完全不同,我将非常感谢您对示例的帮助。
发布于 2010-08-08 11:46:51
将函数mapping到数据数组的想法来自函数式编程。您不应该将array_map
看作一个对数组的每个元素调用一个函数的foreach
循环(即使它是这样实现的)。它应该被认为是将函数独立地应用于数组中的每个元素。
理论上,像函数映射这样的事情可以并行完成,因为应用于数据的函数应该只影响数据,而不是全局状态。这是因为array_map
可以选择将函数应用于项目的任何顺序(即使在PHP中不是这样)。
另一方面,array_walk
与处理数据数组的方法完全相反。它不是单独处理每个项目,而是使用一个状态(&$userdata
)并可以就地编辑项目(非常类似于foreach循环)。因为每次对项目应用$funcname
时,都会改变程序的全局状态,因此需要一种正确的方法来处理项目。
回到PHP界,array_map
和array_walk
几乎是一样的,只是array_walk
让你可以更好地控制数据的迭代,通常用来原地“改变”数据,而不是返回一个新的“改变”的数组。
array_filter
实际上是array_walk
(或array_reduce
)的一个应用程序,提供它或多或少只是为了方便起见。
发布于 2011-04-11 12:32:30
下面的修订旨在更清楚地描述PHP的array_filer()、array_map()和array_walk(),所有这些都源于函数式编程:
array_filter()过滤掉数据,生成一个仅包含前一个数组中所需项的新数组,如下所示:
<?php
$array = array(1, "apples",2, "oranges",3, "plums");
$filtered = array_filter( $array, "ctype_alpha");
var_dump($filtered);
?>
实时代码here
所有的数值都会从$array中过滤掉,只剩下$filtered的水果类型。
array_map()还创建了一个新数组,但与array_filter()不同的是,生成的数组包含输入$filtered的每个元素,但由于对每个元素应用了回调,因此值发生了变化,如下所示:
<?php
$nu = array_map( "strtoupper", $filtered);
var_dump($nu);
?>
实时代码here
本例中的代码使用内置的strtoupper()应用回调,但用户定义的函数也是另一个可行的选择。回调将应用于$filtered的每一项,从而生成元素包含大写值的$nu。
在接下来的代码片段中,数组walk()遍历$nu并通过引用运算符'&‘对每个元素进行更改。更改发生时不会创建额外的数组。每个元素的值都会相应地更改为更具信息性的字符串,以指定其键、类别和值。
<?php
$f = function(&$item,$key,$prefix) {
$item = "$key: $prefix: $item";
};
array_walk($nu, $f,"fruit");
var_dump($nu);
?>
请参阅demo
注意:与array_walk()有关的回调函数有两个参数,当array_walk()调用时,这两个参数将自动获取元素的值及其键,并按该顺序获取。(请参阅更多here)。
https://stackoverflow.com/questions/3432257
复制相似问题