Как я могу преобразовать вывод парсера Symfony yaml в полностью ассоциативный формат? - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть файл .yaml, подобный этому.

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

После этого я анализирую его с помощью синтаксического анализатора YAML symfony, я получаю этот результат.

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

Как создать чистую рекурсивную функцию?

1 Ответ

0 голосов
/ 16 июля 2019

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