Преобразование плоской таблицы данных в многомерный массив - PullRequest
1 голос
/ 09 января 2012

У меня есть эти данные (столбцы: глубина, имя, значение, порядок правильный):

0, id,    12
0, name,  Name
0, pages,
1, 0,     Page 1
1, 1,     Page 2
1, 2,     Page 3
0, items,
1, 0,
2, id,    4
2, title, Example Items

И я пытаюсь создать структуру массива, подобную этой:

Array
(
    [id] => 12
    [name] => Name
    [pages] => Array
        (
            [0] => Page 1
            [1] => Page 1
            [2] => Page 1
        )
    [items] => Array
        (
            [0] => Array
                (
                    [id] => 4
                    [title] => Example Item
                )
        )
)

Каждая попытка, которую я до сих пор пытался, терпела неудачу, я просто не могу понять мою логику.Любая помощь будет оценена.Спасибо.

1 Ответ

3 голосов
/ 09 января 2012

Вы можете сделать это с помощью небольшого количества хитрости. Если ваш CSV-вход преобразуется в список, например:

$in = array_map("str_getcsv", explode("\n", $table));

Тогда вы можете пройти как:

$data = array();

foreach ($in as $row) {
    list ($depth, $key, $value) = $row;

    $r = & $data;  // start from base array, then submerge $n last keys
    while ($depth--) { end($r); $r = & $r[key($r)]; }

    $r[$key] = $value;
}

По крайней мере, работает для вашего примера:

Array
(
    [id] => 12
    [name] => Name
    [pages] => Array
        (
            [0] => Page 1
            [1] => Page 2
            [2] => Page 3
        )

    [items] => Array
        (
            [0] => Array
                (
                    [id] => 4
                    [title] => Example Items
                )

        )

)
...