首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >array_map、array_walk和array_filter的区别

array_map、array_walk和array_filter的区别
EN

Stack Overflow用户
提问于 2010-08-08 06:19:36
回答 2查看 190.4K关注 0票数 396

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

他们会做同样的事情吗?

它们可以互换使用吗?

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

EN

回答 2

Stack Overflow用户

发布于 2010-08-08 11:46:51

将函数mapping到数据数组的想法来自函数式编程。您不应该将array_map看作一个对数组的每个元素调用一个函数的foreach循环(即使它是这样实现的)。它应该被认为是将函数独立地应用于数组中的每个元素。

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

另一方面,array_walk与处理数据数组的方法完全相反。它不是单独处理每个项目,而是使用一个状态(&$userdata)并可以就地编辑项目(非常类似于foreach循环)。因为每次对项目应用$funcname时,都会改变程序的全局状态,因此需要一种正确的方法来处理项目。

回到PHP界,array_maparray_walk几乎是一样的,只是array_walk让你可以更好地控制数据的迭代,通常用来原地“改变”数据,而不是返回一个新的“改变”的数组。

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

票数 96
EN

Stack Overflow用户

发布于 2011-04-11 12:32:30

下面的修订旨在更清楚地描述PHP的array_filer()、array_map()和array_walk(),所有这些都源于函数式编程:

array_filter()过滤掉数据,生成一个仅包含前一个数组中所需项的新数组,如下所示:

代码语言:javascript
复制
<?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的每个元素,但由于对每个元素应用了回调,因此值发生了变化,如下所示:

代码语言:javascript
复制
<?php

$nu = array_map( "strtoupper", $filtered);
var_dump($nu);
?>

实时代码here

本例中的代码使用内置的strtoupper()应用回调,但用户定义的函数也是另一个可行的选择。回调将应用于$filtered的每一项,从而生成元素包含大写值的$nu。

在接下来的代码片段中,数组walk()遍历$nu并通过引用运算符'&‘对每个元素进行更改。更改发生时不会创建额外的数组。每个元素的值都会相应地更改为更具信息性的字符串,以指定其键、类别和值。

代码语言:javascript
复制
<?php

$f = function(&$item,$key,$prefix) {
    $item = "$key: $prefix: $item";
}; 
array_walk($nu, $f,"fruit");
var_dump($nu);    
?>    

请参阅demo

注意:与array_walk()有关的回调函数有两个参数,当array_walk()调用时,这两个参数将自动获取元素的值及其键,并按该顺序获取。(请参阅更多here)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3432257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档