1

単一の配列をサブキーに分割するにはどうすればよいですか?

$arr = array(
             0 => array(
                        'foo' => '1',
                        'bar' => 'A'
                       ),
             1 => array(
                        'foo' => '2',
                        'bar' => 'B'
                       ),
             2 => array(
                        'foo' => '3',
                        'bar' => 'C'
                       )
            );

foo と bar の配列を別々に返す最も効率的な方法は何ですか?

私はここに着く必要があります:

$foo = array('1','2','3');
$bar = array('A','B','C');

array_mapまたは同様のものを使用してこれを行う賢い方法があることを願っています。何か案は?

または、ループして各配列をそのように構築する必要がありますか? 何かのようなもの:

foreach ($arr as $v) {
    $foo[] = $v['foo'];
    $bar[] = $v['bar'];
}
4

3 に答える 3

1

幸運な偶然に、私は今日、ほぼまったく同じことをする必要がありました。array_map()次のものと組み合わせて使用​​できますarray_shift()

$foo = array_map('array_shift', &$arr);
$bar = array_map('array_shift', &$arr);

$arr参照によって渡されることに注意してください。そうしないと、毎回 の内容が返され$arr[<index>]['foo']ます。ただし、ここでも参照のために - を再利用することはできません$arr。そのため、それを行う必要がある場合は、最初にコピーしてください。

array_shift()欠点は、実際にはキーが何であるかがわからないため、配列キーを例と同じ方法で順序付けする必要があることです。次の配列では機能しません。

$arr = array(
    0 => array(
        'foo' => '1',
        'bar' => 'A'
    ),
    1 => array(
        'bar' => 'B',
        'foo' => '2'
    ),
    2 => array(
        'foo' => '3',
        'bar' => 'C'
    )
);

アップデート:

E_DEPRECATEDコメントを読んだ後、私のソリューションがcall-time-pass-by-reference の警告をトリガーすることが明らかになりました。@Baba が提案する (そして回答として受け入れられる) 代替案を次に示します。これは、2 次元配列の最初と最後の要素である 2 つの必要なキーを利用します。

$foo = array_map('array_shift', $arr);
$bar = array_map('array_pop', $arr);
于 2012-11-30T00:45:27.850 に答える
0

array_merge_recursive同じキーを持つスカラー値を配列に結合します。例えば:

array_merge_recursive(array('a',1), array('b',2)) === array(array('a','b'),array(1,2));

このプロパティを使用しarray_merge_recursiveて、配列内の各配列に個別の引数として単純に適用できます。

call_user_func_array('array_merge_recursive', $arr);

次の結果が得られます。

array (
  'foo' => 
  array (
    0 => '1',
    1 => '2',
    2 => '3',
  ),
  'bar' => 
  array (
    0 => 'A',
    1 => 'B',
    2 => 'C',
  ),
)

異なる順序のキーによって混乱することさえありません。

ただし、すべてのマージされた値はスカラーでなければなりません! 配列は、サブ配列として追加される代わりにマージされます。

array_merge_recursive(array(1), array(array(2)) === array(array(1,2))

出ませarray(array(1, array(2)))

于 2013-02-19T03:32:00.557 に答える
0
$n = array();

foreach($arr as $key=>$val) {
    foreach($val as $k=>$v) {
        $n[$k][] = $v;
    }
}
于 2012-11-29T22:40:54.803 に答える