6

https://wiki.php.net/rfc/array_columnによると、array_columnはまもなくPHPに追加される予定です。しかし、RFCを理解するのに苦労しています。名前付きキーが存在しない場合は何が返されますか?

例:

$arr = array(
    array(
        'firstname' => 'Bob',
        'lastname'  => 'Tomato'
    ),
    array(
        'firstname' => 'Larry',
        'lastname'  => 'Cucumber'
    )
);

$middlenames = array_column($arr, 'middlename');
4

2 に答える 2

9

序章

あなたが理解するRFCためには、最初に問題とそれが導入された理由を理解する必要があります。

あなたのアレイ

$arr = array(
        array(
                'firstname' => 'Bob',    <--
                'lastname' => 'Tomato'     |    <--
        ),                                 |      |
        array(                             |      |
                'firstname' => 'Larry',  <--      |
                'lastname' => 'Cucumber'        <-|
        )
);

列の取得

取得する、Bob & LarryまたはTomato and Cucumber複数行のコード例を使用している場合は、次のとおりです。

$colums = array();
foreach ( array_map(null, $arr[0], $arr[1]) as $value ) {
    $colums[] = $value;
}
print_r($colums);

出力

Array
(
    [0] => Array
        (
            [0] => Bob
            [1] => Larry
        )

    [1] => Array
        (
            [0] => Tomato
            [1] => Cucumber
        )

)

動的バージョン

上記のコードは、別の創造的な方法である要素の数を知っている場合にのみ機能します

$colums = array();
array_unshift($arr, null);
foreach (call_user_func_array("array_map", $arr) as $value ) {
    $colums[] = $value;
}

ライブテスト

またはより良い敷居の使用MultipleIterator

$mi = new MultipleIterator(MultipleIterator::MIT_NEED_ALL);
foreach ( $arr as $v ) {
    $mi->attachIterator(new ArrayIterator($v));
}

$colums = array();
foreach ( $mi as $v ) {
    $colums[] = $v;
}
print_r($colums);

ライブテスト

キー名

ここでキー名を取得する必要がある場合は、別の方法です

$colums = array_reduce($arr, function ($a, $b) {
    foreach ( $b as $k => $v ) {
        $a[$k][] = $v;
    }
    return $a;
});

ライブテスト

戻るarray_column

array_column単純にプロセスを意図しており、名の付いたすべての列を取得するのは次のように簡単です。

 print_r(array_column($arr,"lastname"));
                               ^
                               |
                               +--- This get value with key "lastname"

ライブテスト

より複雑なセネリオ

配列にこの出力を持たせたいと想像してください

Array
(
    [Bob] => Tomato
    [Larry] => Cucumber
)

あなたが持つことができる古い方法を使用してください

$colums = array();
array_unshift($arr, null);
foreach (call_user_func_array("array_map", $arr) as $value ) {
    $key = array_shift($value);
    $colums[$key] = current($value);
}
print_r($colums);

ライブテスト

これで、私が使用array_shiftしなければならなかったことがわかりcurrent、最初の2つの要素を取得する必要がありました..配列が大きくなるにつれて、これは複雑になる可能性がありますが、これarray_columnを単純化するでしょう

print_r(array_column($arr,"lastname","firstname"));
                              ^           ^
                              |           |
                             Value       Key    (I wonder why position is backwards)

出力

Array
(
    [Bob] => Tomato
    [Larry] => Cucumber
)

最後に質問に戻ります

What will be returned if a named key doesn't exist?

空の配列...あなたの例から

 print_r(array_column($arr,"middlename"));
                                ^
                                |
                        it would try to check if any of your array has key middle man

戻ります

Array        <------- Otherwise returns empty array 
(
)

結論

、、を使用してさまざまな例を使用しloop、何を達成しようとしているのかを説明しました。array_maparray_reduceMultipleIteratorarray_column

ご覧のとおりarray_column、はるかに単純化されていますが、RFCの例を少し試してみることをお勧めします。これにより、まだ理解していない場合でも理解しやすくなります。これPHPは、いつでも独自のバージョンを実装できる柔軟な言語です。

于 2013-04-05T01:32:24.787 に答える
6

によると:https ://wiki.php.net/rfc/array_column

対応するindexKeyが見つからない場合、値はゼロから始まる整数でキー設定されます。

RFCで使用される例:

$mismatchedColumns = array(
   array(
       'a' => 'foo',
       'b' => 'bar',
       'e' => 'baz'
   ),
   array(
       'a' => 'qux',
       'c' => 'quux',
       'd' => 'corge'
   ),
   array(
       'a' => 'grault',
       'b' => 'garply',
       'e' => 'waldo'
   ),
);

$foo = array_column($mismatchedColumns, 'a', 'b');

結果は次の$fooようになります。

Array
(
   [bar] => foo
   [0] => qux
   [garply] => grault
)

基本的に、aのが新しい配列値になり、bがキーになります。元の配列にキーbが含まれていない場合、0インデックスが作成され、代わりにそれが使用されます。存在しないキーが複数ある場合、それらは0から増分されます。

それらの例をもう少し詳しく見てみると、元の配列の値と一致できない場合、配列要素をまったく取得できないことが示唆されます。これは、配列内で単一の値を探していて、それが存在しなかった場合、空の配列を返すことを意味します。


PS私は明らかにこの関数を使用したことがないので、これのほとんどはRFCの解釈です。


ちなみに、この関数はPHPに含めることが認められており、元々はBen Ramseyによって提案され、賛成38票、反対6票の最終結果が得られました。メーリングリストの議論はここで見ることができます:http://grokbase.com/t/php/php-internals/126nxxa80p/draft-rfc-array-column-functionhttps://github.com/php/php-src/pull/257も参照してください

于 2013-03-11T20:52:18.980 に答える