php数组遍历函数array_filter()、array_map()、array_walk()、array_reduce三者的用法和区别

array_filter() 重点在于过滤(而不是新增)某个元素,当你处理到一个元素时,返回过滤后的数组
array_map() 重点在于遍历一个数组或多个数组的元素,返回一个新的数组
array_walk() 重点在于遍历数组进行某种操作

array_filter() 和 array_walk()对一个数组进行操作,数组参数在前,函数参数在后
array_map() 可以处理多个数组,因此函数参数在前,数组参数在后,可以根据实际情况放入多个数组参数

array_reduce( arr , callablecallback )
使用回调函数迭代地将数组简化为单一的值。其中arr 为输入数组,callback(result ,value)接受两个参数,result为上一次迭代产生的值,value是当前迭代的值。

Copy Highlighter-hljs
类似于laravel pluck的函数 $arr = array_reduce($prodcuts,function (&$arr,$v){ $arr[$v['id']] = $v['title']; return $arr; }); //数组求和 $a = [1,2,3]; $num = array_reduce($a, function($result,$value){ return $result+$value; }) echo $num;//6 //字符串拼接 $arr = [ ['id'=>1,'name'=>"c"], ['id'=>2,'name'=>"b"], ['id'=>3,'name'=>"a"] ]; $str = array_reduce($arr, function($result, $value){ return $result.",".$value['id']; }); echo $str;//,1,2,3

array_filter(array callback [, int $flag = 0 ]])
  依次将 array 数组中的每个值传递到 callback 函数。如果 callback 函数返回 true,则 array 数组的当前值会被包含在返回的结果数组中。数组的键名保留不变。
array_filter会过滤掉任何值等于FALSE的值,也就是说 0值,空字符串,null,都会被过滤。

简言之:利用自定义函数对原数组进行筛选

Copy Highlighter-hljs
示例1$newarr2 = array_filter($arr, function($value){ if ($value%2 ==0) return false; return true; }); var_dump($newarr2);die; //输出结果 array(2) { ["a"]=> int(1) ["c"]=> int(3) } 示例2$arr = ['a','b',1,2,3]; $new_arr = array_filter($arr,function($val){ return is_numeric($val); }); var_dump($new_arr); //返回结果 //array (size=3) // 2 => int 1 // 3 => int 2 // 4 => int 3

array_map()
  该函数将用户自定义函数作用到数组中的每个值上,并返回用户自定义函数作用后的带有新值的数组。
  可以传递多个数组,回调函数接受的参数数目应该和传递给 array_map() 函数的数组数目一致。

向array_map传入数组,出来的还是数组,而不是上面array_reduce()的一个值。
所以,array_map()最简单的就是把callback函数作用到每个数组的值上,最常见的场景就是 intval()、trim() 数组中的值.
简言之:有返回值,利用自定义函数对数组的每个元素进行修改

Copy Highlighter-hljs
示例1//字符串转为整型 $arr = ['1','2','3']; array_map('intval', $arr); 示例2$arr1 = [1,2,3,4,5]; $arr2 = [6,7,8,9,10]; //函数写前面,数组参数写后面 $new_arr = array_map(function($val1,$val2){ return $val1 + $val2; },$arr1,$arr2); var_dump($new_arr); //返回结果 //array (size=5) // 0 => int 7 // 1 => int 9 // 2 => int 11 // 3 => int 13 // 4 => int 15

array_walk()
  
函数对数组中的每个元素应用用户自定义函数。在函数中,数组的键名和键值是参数。

注释:您可以通过把用户自定义函数中的第一个参数指定为引用:&$value,来改变数组元素的值

简言之:没有返回值。将自定义函数作用于每个数组元素,但不会影响数组。自定义函数的第一个参数传引用则会影响数组

Copy Highlighter-hljs
示例1#array_walk 传引用,第三个参数传给回调函数 $arr = [1,2,3,4,5,6]; $a = 2; //遍历数组arr,闭包函数的第三个参数可以额外传递一个变量 array_walk($arr, function(&$v, $k, $a){ $v = $v + $a; }, $a); var_dump($arr);die; 示例2//将数组中的元素用于某种操作 $arr = ['a','b','c']; array_walk($arr,function($val,$key){ echo "{$key} is {$val} <br/>"; }); //返回结果 //0 is a //1 is b //2 is c //改变数组中的值,传参的时候使用引用 array_walk($arr,function(&$val,$key){ $val .= $val; }); var_dump($arr); //array (size=3) // 0 => string 'aa' (length=2) // 1 => string 'bb' (length=2) // 2 => string 'cc' (length=2)

异同点

array_filter() 重点在于过滤(而不是新增)某个元素,当你处理到一个元素时,返回过滤后的数组
 array_map() 重点在于遍历一个数组或多个数组的元素,返回一个新的数组
 array_walk() 重点在于遍历数组进行某种操作, 对原数组进行操作

array_filter() 和 array_walk()对一个数组进行操作,数组参数在前,函数参数在后
 array_map() 可以处理多个数组,因此函数参数在前,数组参数在后,可以根据实际情况放入多个数组参数

array_filter()函数过滤空数组#

array_filter()如果没有给出回调函数,所有的等于 FALSE 的元素将会被移除掉

Copy Highlighter-hljs
$entry = array(               0 => 'hello world',               1 => false,               2 => 1,               3 => null,               4 => '',               5 => 'https://www.jb51.net',               6 => '0',              7 => array(),              8 => 0           ); $validarr = array_filter($entry); print_r($validarr); //输出结果: Array (     [0] => 'hello world'     [2] => 1     [5] => https://www.jb51.net )

一些可以转化为布尔型FALSE的数组元素都被移除了,对我们想要得到一个有效的数组作了一个非常全面的过滤。

array_walk_recursive处理多维数组,函数的参数是键和值

Copy Highlighter-hljs
1、取键值: array_walk_recursive($contentArr, function ($value, $key) use (&$result) { array_push($result, $key); }); 2、取键值: array_walk_recursive($contentArr, function ($value, $key) use (&$result) { array_push($result, $value); });
posted @   caibaotimes  阅读(2339)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示
CONTENTS