gpt4 book ai didi

php - 使用匿名函数回调根据值拆分数组

转载 作者:行者123 更新时间:2023-12-02 22:36:42 25 4
gpt4 key购买 nike

给定一个数组 $arr 的形式:

Array (
[0] => Array ([id] => id1, ...)
[1] => Array ([id] => id1, ...)
[2] => Array ([id] => id2, ...)
...
)

使用这个 foreach 循环:

$rowsById = [];
foreach ($arr as $row) {
$rowsById[$row['id']][] = $row;
}

我们可以将其转换为以下形式的数组(以 id 为键):

Array (
[id1] => Array (
[0] => Array ([id] => id1, ...)
[1] => Array ([id] => id1, ...)
)
[id2] => Array (
[0] => Array ([id] => id2, ...)
)
...
)

我们可以在没有 foreach 循环的情况下做同样的事情吗?(也就是说,使用一些迭代函数,如 array_walk 和回调)

最佳答案

$map = array();
array_walk($arr, function($row, $i) use(&$map) { $map[$row['id']][] = $row; });

从形式上看,这个解决方案是对你问题的肯定回答。

但是,如果您想加快代码速度,或者即使您想要更干净的代码而又不想在其他地方丢失太多东西,令人惊讶的是:这个解决方案肯定更慢 比你的 foreach 循环(在我的机器上是 3 的因子)。原因几乎可以肯定是对匿名函数的函数调用,这在 foreach 解决方案中是不存在的。正如我已经在另一个 answer 中指出的那样在 SO 上,消耗 CPU 时间的是函数调用

如果我们可以组合简单的 array_ 函数来获得相同的结果,情况可能会有所不同,但事实上 ['id'] 必须以某种方式访问​​,创建中间数组的开销,加上没有 array_ 函数可用于直接分配给 keyed bins 的事实,使得这是一项不可能完成的任务。

例如,我在意识到它是错误之前发布的这段代码(因为它替换而不是附加到垃圾箱)

$map = array_combine(array_map(function($a) { return $a['id']; }, $arr), $arr);

在我的机器上比你的 foreach2.5

因此,最后,您的问题的答案是:“是的,如果我们不关心处理时间”。

关于php - 使用匿名函数回调根据值拆分数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11376787/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com