PHPで多次元配列を1次元配列にする(RecursiveIteratorIterator使用)

多次元配列を.で連結して1次元配列にしたい

やりたいことはこんな感じです。

多段の連想配列(普通の配列でも可)を、それぞれのキーを.で順に連結して一意の1次元配列にします。

インプット

Array
(
    [parent] => Array
        (
            [childA] => A
            [childB] => B
            [childC] => Array
                (
                    [grandchildX] => X
                    [grandchildY] => Y
                )

        )

)

アウトプット

Array
(
    [parent.childA] => A
    [parent.childB] => B
    [parent.childC.grandchildX] => X
    [parent.childC.grandchildY] => Y
)

ソースコード

<?php

// 多次元配列のキーを.で連結して1次元配列にする。
function toSingleDimension(array $multiArray)
{
    $singleArray = array();

    $iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($multiArray), RecursiveIteratorIterator::SELF_FIRST);

    for ($iterator; $iterator->valid(); $iterator->next()) {
        $key = $iterator->key();
        $current = $iterator->current();
        $depth = $iterator->getDepth();
        $keymap[$depth] = $key;

        if (is_array($current)) {
            continue;
        }

        if ($depth > 0) {
            $keyList = array();
            for ($i = 0; $i <= $depth; $i++) {
                $keyList[] = $keymap[$i];
            }
            $key = implode('.', $keyList);
        }

        $singleArray[$key] = $current;
    }

    return $singleArray;
}

        
$data = array('parent' => array('childA' => 'A', 'childB' => 'B', 'childC' => array('grandchildX' => 'X', 'grandchildY' => 'Y')));

print_r($data);
print_r(toSingleDimension($data));

やっていること

RecursiveIteratorIteratorの公式ドキュメント

http://php.net/manual/ja/class.recursiveiteratoriterator.php

コンストラクタのオプション