如何简化按键分组子数组的代码?PHP是否有等效内置函数?
替代foreach循环实现分组的PHP内置函数方案
当然有替代的内置函数方案啦!不用写foreach循环也能搞定这个按pairType分组收集id的需求~
最直接的方法是使用PHP的array_reduce()函数,它可以遍历数组并累积出我们想要的结果:
$pairs = [['id' => 1, 'pairType' => 2], ['id' => 2, 'pairType' => 2], ['id' => 3,'pairType' => 3]]; // 用匿名函数实现分组 $tmp = array_reduce($pairs, function($carry, $item) { // 将当前元素的id追加到对应pairType的分组中 $carry[$item['pairType']][] = $item['id']; // 返回累积的结果,供下一次循环使用 return $carry; }, []); // 最终$tmp的结果就是:[2 => [1, 2], 3 => [3]]
如果你使用的是PHP 8.1及以上版本,还可以用更简洁的箭头函数写法,让代码更紧凑:
$tmp = array_reduce($pairs, fn($carry, $item) => ($carry[$item['pairType']][] = $item['id']) && $carry, []);
不过要注意,这种箭头函数的写法利用了逻辑与的短路特性,虽然代码短,但可读性会稍弱一些,你可以根据自己的习惯选择。
另外补充一下:PHP目前没有专门的array_group_by()内置函数(很多第三方框架会封装这个功能),但array_reduce()完全可以完美替代你原来的foreach循环逻辑,实现相同的效果。
内容的提问来源于stack exchange,提问作者XWizard




