動的に構築した配列があります。構造上、ネストされた配列がたくさんありますが、深さは私には役に立たないので、後で整理します。次のようになります。
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が進むべき道である場合、私は何を間違っていますか?
前もって感謝します。