如何将 symfony yaml 解析器输出转换为完全关联格式?

How can i convert symfony yaml parser output to completely associative format?

我有一个这样的 .yaml 文件。

Folder1:
    - Hello_.doc
    - Folder2:
        - Hello__.doc
        - World__.pdf
    - Folder3:
        - Hello__.doc
        - Folder4:
            - Hello___.doc
            - Folder5:
                - Hello____.doc
            - Folder6:
                - Hello____.doc

之后我通过 symfony YAML 解析器解析它,我得到了这个结果。

$data = Array
(
    [Folder1] => Array
        (
            [0] => Hello_.doc
            [1] => Array
                (
                    [Folder2] => Array
                        (
                            [0] => Hello__.doc
                            [1] => World__.pdf
                        )

                )

            [2] => Array
                (
                    [Folder3] => Array
                        (
                            [0] => Hello__.doc
                            [1] => Array
                                (
                                    [Folder4] => Array
                                        (
                                            [0] => Hello___.doc
                                            [1] => Array
                                                (
                                                    [Folder5] => Array
                                                        (
                                                            [0] => Hello____.doc
                                                        )

                                                )

                                            [2] => Array
                                                (
                                                    [Folder6] => Array
                                                        (
                                                            [0] => Hello____.doc
                                                        )

                                                )

                                        )

                                )

                        )

                )

        )

)

但我需要将数组数据转换为如下格式:

Array
(
    [Folder1] => Array
        (
            [0] => Hello_.doc
            [Folder2] => Array
                (
                    [0] => Hello__.doc
                    [1] => World__.pdf
                )

            [Folder3] => Array
                (
                    [0] => Hello__.doc
                    [Folder4] => Array
                        (
                            [0] => Hello___.doc
                            [Folder5] => Array
                                (
                                    [0] => Hello____.doc
                                )

                            [Folder6] => Array
                                (
                                    [0] => Hello____.doc
                                )

                        )

                )

        )

);

我创建了一个这样的函数。

function normalizeData($data) {
    foreach ($data as $ky => $row) {

        if (is_array($row)) {
            foreach ($row as $k => $v) {
               if (is_numeric($k) && is_array($v)) {
                    $key = key($v);
                    if (! is_numeric($key)) {
                        $data[$ky][$key] = $v[$key];
                        unset($data[$ky][$k]);
                    }
                } elseif (is_string($k) && is_array($v)) { // associative 

                    foreach ($v as $kk => $vv) {
                        if (is_numeric($kk) && is_array($vv)) {
                           $key_ = key($vv);
                            if (! is_numeric($key_)) {
                                $data[$ky][$k][$key_] = $vv[$key_];
                                unset($data[$ky][$k][$kk]);
                            }
                        } elseif (is_string($kk) && is_array($vv)) {      

                            // We need recursive in here..
                            // 
                            foreach ($vv as $kkk => $vvv) {

                                if (is_numeric($kkk) && is_array($vvv)) {
                                   $key__ = key($vvv);
                                    if (! is_numeric($key__)) {
                                        $data[$ky][$k][$kk][$key__] = $vvv[$key__];
                                        unset($data[$ky][$k][$kk][$kkk]);
                                    }
                                } elseif (is_string($kkk) && is_array($vvv)) { 

                                    /// recursive

                                }

                            }

                        }
                    }
                }
            }
        }
    }
    return $data;
}

但是我必须调用这个函数三次来规范化数据。

$data = normalizeData($data);
$data = normalizeData($data);
$data = normalizeData($data);

如何创建干净的递归函数?

Spyc会输出数组结构,你要找的。

PHP:

include('spyc.php');

$yaml = 
'Folder1:
    Hello_.doc
    Folder2:
        Hello__.doc
        World__.pdf
    Folder3:
        Hello__.doc
        Folder4:
            Hello___.doc
            Folder5:
                Hello____.doc
            Folder6:
                Hello____.doc';

$array = spyc_load($yaml);

print_r($array);

输出:

Array
(
    [Folder1] => Array
        (
            [0] => Hello_.doc
            [Folder2] => Array
                (
                    [0] => Hello__.doc
                    [1] => World__.pdf
                )
            [Folder3] => Array
                (
                    [0] => Hello__.doc
                    [Folder4] => Array
                        (
                            [0] => Hello___.doc
                            [Folder5] => Array
                                (
                                    [0] => Hello____.doc
                                )
                            [Folder6] => Array
                                (
                                    [0] => Hello____.doc
                                )
                        )
                )
        )
)