1

次のような、フォルダー構造に非常によく似たネスト構造があります。

Array
(
    [level_one_1] => Array
        (
            [level_two_1] => value1
            [level_two_2] => valuetwo
            [level_two_3] => value_three
        )
    [level_one_2] => Array
        (
            [level_two_4] => value1
            [level_two_5] => valuetwo
            [level_two_6] => value_three
        )
    [level_one_3] => Array
        (
            [level_two_2] => valuetwo
            [level_two_3] => value_three
        )
)

それを次のようなものに変換する簡単な方法はありますか:

Array
(
    [level_one_1/level_two_1] => value1
    [level_one_1/level_two_2] => valuetwo
    [level_one_1/level_two_3] => value_three

    [level_one_2/level_two_4] => value1
    [level_one_2/level_two_5] => valuetwo
    [level_one_2/level_two_6] => value_three)

    [level_one_3/level_two_2] => valuetwo
    [level_one_3/level_two_3] => value_three
)

レベル間のスラッシュはセパレーターになります-何でもかまいません。また、レベルの動的な数になります。

事前定義された array* 関数を使用してこれを行う方法はありますか? 再帰で?

4

1 に答える 1

1

このようなもの。テストされていませんが、正しい方向に始めるのに役立つはずです:

$myArray = array(
'level_one_1' => array(
        'level_two_1' => 'value1',
        'level_two_2' => 'valuetwo',
        'level_two_3' => 'value_three'
),
'level_one_2' => array(
        'level_two_4' => 'value1',
        'level_two_5' => 'valuetwo',
        'level_two_6' => 'value_three'
),
'level_one_3' => array(
        'level_two_2' => 'valuetwo',
        'level_two_3' => 'value_three'
));
$ritit = new RecursiveIteratorIterator(new RecursiveArrayIterator($myArray));
$result = array();
foreach ($ritit as $leafValue) {
    $keys = array();
    foreach (range(0, $ritit->getDepth()) as $depth) {
        $keys[] = $ritit->getSubIterator($depth)->key();
    }
    $result[ join('/', $keys) ] = $leafValue;
}
于 2012-05-08T04:25:16.027 に答える