0

動的に構築した配列があります。構造上、ネストされた配列がたくさんありますが、深さは私には役に立たないので、後で整理します。次のようになります。

Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [0] => Array
                        (
                            [0] => Array
                                (
                                    [index] => -1
                                    [cost] => 0.189956571618
                                )
                        )         
                )
        )

    [1] => Array
        (
            [index] => -1
            [cost] => 2.18650011647
        )
)

この配列をほぼフラットにしたい (つまり、処理する前に深くネストされていたかどうかに関係なく、すべてのエントリで $array[$i]['cost'] を使用してそのデータにアクセスする)。これまでのところ、私は SPL 再帰を使用してきました。

function flatten($array) {
    $return = array();
    $it = new RecursiveIteratorIterator(new ParentIterator(new RecursiveArrayIterator($array)), RecursiveIteratorIterator::SELF_FIRST);
    foreach($it as $value) {
        if(isset($value['cost'])) {
            $return[] = $value;
        }
    }
    return $return;
}

ほとんどの場合は機能しますが、元の配列の一部の値には「コスト」インデックスがあり、次のようにネストされた配列自体として渡されるため、新しい配列に追加できません。

Array
(
    [0] => Array
        (
            [index] => -1
            [cost] => 0.189956571618
        )

    [1] => Array
        (
            [index] => -1
            [cost] => 2.18650011647
        )
)

...代わりに(ほとんどの場合):

Array
        (
            [index] => -1
            [cost] => 0.189956571618
        )

RecursiveIterator を使用することの全体的なポイントは、配列の奥深くに移動し、配列を持たないエントリ (つまり、必要な「値」) を取得することだと思いました。この仕事に間違ったツールを使用していませんか? もしそうなら、深さがわからない配列をループするのに何がより適切でしょうか? SPLが進むべき道である場合、私は何を間違っていますか?

前もって感謝します。

4

1 に答える 1

1

array_walk_recursive を使用できます

編集

function flatten($array) {
    $return = array();
    array_walk_recursive($array, function($value, $key) use (&$return) {
        if(isset($value['cost']) $return[] = $value;
    });
    return $return;
}

SPL部分で、チャットルームで長い議論を編集し、OPの回答を確認してください

于 2012-08-19T21:17:52.440 に答える