1. 云栖社区>
  2. PHP教程>
  3. 正文

array_reduce学习笔记

作者:用户 来源:互联网 时间:2017-12-01 17:44:01

学习笔记

array_reduce学习笔记 - 摘要: 本文讲的是array_reduce学习笔记, 偶尔看到文章,说用foreach遍历数组是一种低效的行为。我以前可是大量使用foreach的….. 不过现在对几个array族函数产生了深厚的兴趣,在这里写下对array_reduce的理解。 $group=array( array

偶尔看到文章,说用foreach遍历数组是一种低效的行为。我以前可是大量使用foreach的…..

不过现在对几个array族函数产生了深厚的兴趣,在这里写下对array_reduce的理解。

$group=array(    array('id'=>1,'name'=>'组1','power'=>1),    array('id'=>2,'name'=>'组2','power'=>2),    array('id'=>3,'name'=>'组3','power'=>3),);$member=array(    array('group_id'=>1,'id'=>1,'name'=>'张三'),    array('group_id'=>1,'id'=>2,'name'=>'李四'),    array('group_id'=>2,'id'=>3,'name'=>'王五'),);

array_reduce系降维神器,它的作用是迭代,刚上手不易理解。当然array_column更好使,只是版本要求高。

//取$group的id字段作为一维数组$result1=array_reduce($member,function($v,$w){   //array_push($v,$w['id']); 这样写返回的结果是null,不知道为什么    $v[]=$w['id'];    return $v;});print_r($result1); //结果Array ( [0] => 1 [1] => 2 [2] => 3 ) 

现在要实现这样的需求:把$member$group分组,形成一个三维数组;

//用foreachforeach($member as $key=>$val){   foreach($group as $v){       if($v['id']==$val['group_id']) $arr[$v['id']][]=$val;   }}print_r($arr);/*结果Array ( [1] => Array (            [0] => Array ( [group_id] => 1 [id] => 1 [name] => 张三 )             [1] => Array ( [group_id] => 1 [id] => 2 [name] => 李四 ) )     [2] => Array (             [0] => Array ( [group_id] => 2 [id] => 3 [name] => 王五 ) ) ) */

刚学习array_reduce的时候,觉得有点鸡肋,因为除非使用全局变量,否则没办法传参数。但后来了解“闭包”的概念,这个问题就解决了。

$result2 = array_reduce($group, function ($v, $w) use($member){     $v[$w['id']] = array_filter($member, function ($member) use($w){         if ($member['group_id'] == $w['id'])             return true;     });     return $v; }); print_r($result2);//返回结果同上

然而,上面的写法不过是用array_reduce和array_filter实现foreach写法的逻辑,甚至更麻烦。
array_reduce的逻辑应该是这样的:

$result3 = array_reduce($member, function ($v, $w){     $v[$w['group_id']][] = $w;     return $v; }); print_r($result3);//结果同上

确实是高效、简洁,佩服函数设计者的智慧。

以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索学习 笔记 ,以便于您获取更多的相关知识。