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));

ボイラープレートコードを最小化し、再利用性を最大化するために、コンストラクターはある種の引数(たとえば、呼び出す関数)を受け入れることができ、静的ヘルパーを作成できます。

個人的には、元のコードを取得して、再利用可能な関数にラップし、1日と呼びます。

于 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 に答える