【问题标题】:How can i convert symfony yaml parser output to completely associative format?如何将 symfony yaml 解析器输出转换为完全关联格式?
【发布时间】:2018-12-06 10:48:48
【问题描述】:

我有一个这样的 .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;
}

但我必须调用此函数 3 次才能标准化数据。

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

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

【问题讨论】:

    标签: php symfony yaml associative-array data-manipulation


    【解决方案1】:

    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
                                    )
                            )
                    )
            )
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-23
      • 1970-01-01
      • 1970-01-01
      • 2016-09-03
      • 2014-05-18
      相关资源
      最近更新 更多