2

$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 やコールバックなどの反復関数を使用)

4

1 に答える 1

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

正式な観点からは、この解決策はあなたの質問に対する肯定的な回答です。

しかし、コードをスピードアップしたい場合、または他の場所であまり失うことなくよりクリーンなコードが必要な場合でも、驚きがあります。このソリューションはループよりも明らかに遅いです (私のマシンでは3) その理由は、ほぼ間違いなく、foreach ソリューションには存在しない無名関数への関数呼び出しです。SOに関する別の回答ですでに指摘したように、CPU時間を消費するのは関数呼び出しですforeach

array_単純な関数を組み合わせて同じ結果を得ることができれば、この状況は異なる可能性が['id']ありますが、何らかの方法でアクセスする必要があるという事実、中間配列を作成するオーバーヘッド、およびarray_キー付きビンへの直接割り当てに使用できる関数がないという事実により、これは不可能な作業です。

たとえば、間違っていることに気付く前に投稿したこのコード(ビンに追加する代わりに置き換えるため)

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

私のマシンでは、あなたよりも2.5foreach倍遅くなります。

したがって、最後に、あなたの質問に対する答えは、「はい、処理時間を気にしなければ」です。

于 2012-07-07T16:44:42.600 に答える