1

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

3 回答 3

3

由于您已经拥有密钥,因此只需将其组合起来:

$indexedUsers = array_combine($usersIds, $users);

除此之外,foreach通常很优雅,尤其是您概述的这些琐碎案例不需要太多函数逻辑,所以我更喜欢这里的迭代器模式而不是函数式。

于 2012-07-08T23:39:12.787 回答
2

首先,我怀疑array_map()它比你原来的foreach循环更快。永远不要更改代码,因为您认为它更快。当然,如果你认为它更优雅并且速度差异微不足道,那么没人应该在意。

您通常可以考虑在以下情况下使用迭代器:

class ArrayGetIdIterator extends ArrayIterator
{
  public function key()
  {
    return $this->current()->getId();
  }
}

$indexedUsers = iterator_to_array(new ArrayGetIdIterator($users));

为了最大限度地减少样板代码并最大限度地提高可重用性,构造函数可以接受某种类型的参数(例如,要调用哪个函数),您可以创建一个静态帮助程序。

虽然,就我个人而言,我只是将您的原始代码包装成一个可重用的函数并收工。

于 2012-07-08T23:38:02.290 回答
1

您可以在以前的成功基础上继续使用 array_combine ...

$get_user_id = function($user) {return $user->getId();};
$indexedUsers = array_combine(array_map($get_user_id, $users), $users);
于 2012-07-08T23:33:07.833 回答