php – array_map,array_walk和array_filter之间的区别

究竟是什么区别array_maparray_walkarray_filter。我从文档中看到的是,您可以传递回调函数来对提供的数组执行操作。但我似乎没有发现它们之间有任何特别的区别。

他们做同样的事吗?
它们可以互换使用吗?

如果它们完全不同,我将非常感谢您的帮助。


  • 改变价值观:
  • 数组键访问:
  • 返回值:
    • array_map返回一个新数组,array_walk只返回truefalse。因此,如果您不想通过遍历一个数组来创建数组,则应该使用array_walk
  • 迭代多个数组:
    • array_map也可以接收任意数量的数组,它可以并行迭代它们,而array_walk只能在一个数组上运行。
  • 将任意数据传递给回调:
    • array_walk可以接收一个额外的任意参数传递给回调。这与PHP 5.3(引入匿名函数时)无关。
  • 返回数组的长度:
    • 得到的数组array_map与最大输入数组的长度相同; array_walk不返回数组但同时它不能改变原始数组的元素数量; array_filter根据过滤函数仅选取数组元素的子集。它确实保留了密钥。

例:

<pre>
<?php

$origarray1 = array(2.4, 2.6, 3.5);
$origarray2 = array(2.4, 2.6, 3.5);

print_r(array_map('floor', $origarray1)); // $origarray1 stays the same

// changes $origarray2
array_walk($origarray2, function (&$v, $k) { $v = floor($v); }); 
print_r($origarray2);

// this is a more proper use of array_walk
array_walk($origarray1, function ($v, $k) { echo "$k => $v", "\n"; });

// array_map accepts several arrays
print_r(
    array_map(function ($a, $b) { return $a * $b; }, $origarray1, $origarray2)
);

// select only elements that are > 2.5
print_r(
    array_filter($origarray1, function ($a) { return $a > 2.5; })
);

?>
</pre>

结果:

Array
(
    [0] => 2
    [1] => 2
    [2] => 3
)
Array
(
    [0] => 2
    [1] => 2
    [2] => 3
)
0 => 2.4
1 => 2.6
2 => 3.5
Array
(
    [0] => 4.8
    [1] => 5.2
    [2] => 10.5
)
Array
(
    [1] => 2.6
    [2] => 3.5
)

将函数映射到数据数组的想法来自函数式编程。您不应该将其array_map视为foreach在数组的每个元素上调用函数的循环(即使它是如何实现的)。应该将其视为将函数独立应用于数组中的每个元素。

理论上,诸如函数映射之类的事情可以并行完成,因为应用于数据的函数应该仅影响数据而不影响全局状态。这是因为array_map可以选择将函数应用于项目的任何顺序(即使在PHP中它没有)。

array_walk另一方面,它是处理数据数组的完全相反的方法。它不是单独处理每个项目,而是使用state(&$userdata)并且可以在适当的位置编辑项目(很像foreach循环)。由于每次项目都$funcname应用了它,它可能会改变程序的全局状态,因此需要一种正确的处理项目的方法。

早在PHP的土地,array_map以及array_walk几乎相同,除了array_walk让你更好地控制数据的重复,并且通常用来“改变”数据就地和回访新的“改变”阵列。

array_filter实际上是array_walk(或array_reduce)的应用程序,它或多或少只是为方便起见而提供的。


从文档中,

bool array_walk(array&$ array,callback $ funcname [,mixed $ userdata])< – return bool

array_walk接受一个数组和一个函数F,并通过用x替换每个元素来修改它F(x)

array array_map(callback $ callback,array $ arr1 [,array $ …])< – 返回数组

array_map执行完全相同的操作,除了不是在就地修改它将返回一个带有转换元素的新数组。

array array_filter(array $ input [,callback $ callback])< – return array

带有函数的array_filterF,而不是转换元素,将删除任何F(x)不正确的元素

添加评论

友情链接:蝴蝶教程