array_reduce学习笔记

偶尔看到文章,说用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分组,形成一个三维数组;

//用foreach
foreach($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);//结果同上

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值