我最近一直在使用array_map
来替换这种代码:
$users = ...;
$usersIds = array();
foreach ($users as $user) {
$usersIds[] = $user->getId();
}
与
$users = ...;
$usersIds = array_map(function ($user) {
return $user->getId();
}, $users);
它更优雅,我猜测这更有效。
现在我想知道是否可以使用类似于array_map
的函数改进以下代码:
$users = ...;
$indexedUsers = array();
foreach ($users as $user) {
$indexedUsers[$user->getId()] = $user;
}
答案 0 :(得分:2)
首先,我怀疑array_map()
比原始foreach
循环更快。永远不要更改代码,因为你认为它更快。当然,如果你认为它更优雅,速度差异微不足道,那么没有人应该关心。
您通常可以考虑在这些上下文中使用迭代器:
class ArrayGetIdIterator extends ArrayIterator
{
public function key()
{
return $this->current()->getId();
}
}
$indexedUsers = iterator_to_array(new ArrayGetIdIterator($users));
为了最小化样板代码并最大化可重用性,构造函数可以接受某种类型的参数(例如,要调用的函数),并且可以创建一个静态帮助器。
虽然,就个人而言,我只需要使用原始代码,将其包装成可重复使用的功能并将其称为一天。
答案 1 :(得分:2)
因为你已经有了钥匙,只需将它组合起来:
$indexedUsers = array_combine($usersIds, $users);
除此之外,foreach
通常很优雅,特别是这些琐碎的案例你不需要太多的函数逻辑,所以我更喜欢这里的迭代器模式而不是功能。
答案 2 :(得分:1)
您可以在之前的成功基础上继续使用array_combine ...
$get_user_id = function($user) {return $user->getId();};
$indexedUsers = array_combine(array_map($get_user_id, $users), $users);