array_map,array_walk和array_filter之间的区别

20 浏览
0 Comments

array_map,array_walk和array_filter之间的区别

array_maparray_walkarray_filter之间的区别到底是什么?从文档中我了解到,你可以传递一个回调函数来对提供的数组执行操作。但是我似乎没有找到它们之间的任何特别区别。\n它们是否执行相同的操作?
\n它们是否可以互换使用?\n如果它们有任何不同,我将非常感谢您提供一个具有说明性的示例。

0
0 Comments

array_walk、array_map和array_filter都是PHP中用于操作数组的函数。它们的功能有些相似,但存在一些不同之处。

首先,array_walk函数接受一个数组和一个函数作为参数,在原数组上对每个元素应用该函数进行修改。具体来说,它会将原数组中的每个元素x替换为F(x)。但需要注意的是,array_walk并不返回一个新的数组,而是返回一个布尔值,表示操作是否成功。

相比之下,array_map的功能与array_walk类似,也是对数组中的每个元素应用一个函数进行修改。但不同的是,array_map会返回一个新的数组,该数组包含了经过变换后的元素,而不是直接修改原数组。

最后,array_filter函数也是对数组进行操作,但它的目的是删除数组中那些不满足条件的元素。具体来说,它会应用一个函数F,对数组中的每个元素进行判断,如果F(x)为false,则该元素会被删除。同样地,array_filter也会返回一个新的数组,其中包含了满足条件的元素。

在阅读文档时,作者遇到了一个问题:原数组的值消失了。根据文档,作者以为array_walk会返回一个类似于array_map的数组,因此认为问题出在自己的函数上。直到看到这篇文章,作者才意识到array_walk的返回类型是布尔值,而不是数组。因此,解决这个问题的方法是使用array_map代替array_walk,以确保原数组的值不会被修改。

以上就是array_map、array_walk和array_filter之间的区别以及解决方法的整理。这些函数在处理数组时具有不同的功能和返回值类型,因此在使用时需要注意。

0
0 Comments

在函数式编程中,将一个函数映射到数据数组的概念源于映射。不应该将array_map看作是在数组的每个元素上调用函数的foreach循环(即使它是这样实现的)。它应该被视为将函数独立地应用于数组中的每个元素。

理论上,函数映射等操作可以并行执行,因为应用于数据的函数仅影响数据而不影响全局状态。这是因为array_map可以选择任何顺序来对项目应用函数(尽管在PHP中并不是这样)。

另一方面,array_walk则完全相反地处理数组数据的方式。它不是分别处理每个项目,而是使用一个状态(&$userdata)并可以直接在原地编辑项目(类似于foreach循环)。由于每次将$funcname应用于项目时,都可能更改程序的全局状态,因此需要一种正确的处理项目的方法。

回到PHP领域,array_maparray_walk几乎是相同的,只是array_walk可以更好地控制数据的迭代,并且通常用于原地“更改”数据而不是返回一个新的“更改后”的数组。

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

对于你第二段关于“理论上这样的函数映射可以并行执行,因为应用于数据的函数应该只影响数据而不影响全局状态”的洞察力,我给你点个赞。对于我们并行编程者来说,这是一个有用的事情要记住的事情。

你能解释一下如何使用array_walk()来实现array_filter()吗?

使用array_walk()无法实现filter,正如在[stackoverflow.com/a/3432266/3088045]( 's answer)中的"Length of Returned Array"所提到的,使用walk时无法改变元素的数量。

0
0 Comments

array_map、array_walk和array_filter是PHP中用于处理数组的函数。它们的使用方式和功能有一些区别。

首先,array_map无法改变输入数组中的值,而array_walk可以。array_map只返回一个新数组,而array_walk返回的是布尔值true。如果不想创建一个新数组而是想在原数组上进行操作,应该使用array_walk。

其次,array_map不能操作数组的键,而array_walk可以。

另外,array_map还可以接收多个数组,并且可以并行地对它们进行迭代,而array_walk只能操作一个数组。

此外,array_walk可以接收额外的参数传递给回调函数,但自PHP 5.3起,这个功能已经不太重要了,因为引入了匿名函数。

最后,array_map返回的数组长度与最大输入数组的长度相同;array_walk不返回数组,但同时也不能改变原始数组的元素数量;array_filter根据过滤函数选择数组的子集,它会保留键。

下面是一个示例代码:

$origarray1 = array(2.4, 2.6, 3.5);
$origarray2 = array(2.4, 2.6, 3.5);
print_r(array_map('floor', $origarray1)); // $origarray1保持不变
array_walk($origarray2, function (&$v, $k) { $v = floor($v); }); // 改变$origarray2
print_r($origarray2);
array_walk($origarray1, function ($v, $k) { echo "$k => $v", "\n"; }); // 输出$origarray1的值
print_r(
    array_map(function ($a, $b) { return $a * $b; }, $origarray1, $origarray2) // 对两个数组进行并行迭代
);
print_r(
    array_filter($origarray1, function ($a) { return $a > 2.5; }) // 选择大于2.5的元素
);

上述代码的运行结果为:

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
)

根据PHP手册的描述,array_walk只能改变数组的值,不能改变键;array_map不能操作数组的键。虽然可以通过创建一个由键组成的数组来间接改变键,但这只是一个变通方法,不能否定这个说法。

此外,虽然array_map不能直接改变值,但通过将结果赋值给同一个数组,实际上是改变了它的值。而array_walk在直接操作同一数组时不会直接改变其值,除非将值传递给回调函数时使用引用传递。总之,无论值是否通过引用返回或传递,改变值的方式以及返回值的存在与否并没有太大的区别,但array_walk可以操作索引,array_map可以操作多个数组。

此外,array_walk接收的第一个数组参数是一个引用,但如果想要改变它,还需要将回调函数的值参数也作为引用传递。

0