偶尔看到文章,说用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);//结果同上
确实是高效、简洁,佩服函数设计者的智慧。