函数类似于array_map以重新索引数组

时间:2012-07-08 23:22:57

标签: php arrays php-5.3

我最近一直在使用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;
}

3 个答案:

答案 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);
相关问题