Как построить древовидную структуру из массива в PHP - PullRequest
0 голосов
/ 18 апреля 2020

У меня есть следующая таблица:

$arr = array(
  array('id'=>100, 'year'=>2019, 'month'=>9, 'name'=>'a'),
  array('id'=>101, 'year'=>2019, 'month'=>12, 'name'=>'b'),
  array('id'=>102, 'year'=>2020, 'month'=>1, 'name'=>'c'),
  array('id'=>103, 'year'=>2020, 'month'=>2, 'name'=>'d'),
);

С кодом ниже

$tree = array();
foreach ($arr as $row) {
    $tree[$row['year']] = array(
        $row['month'] => array (
            'id' => $row['id'],
            'name' => $row['name'],
        ),
    );
}

Я хотел бы получить следующий результат - эта структура в виде дерева:

Array
(
    [2019] => Array
        (
            [9] => Array
                (
                    [id] => 100
                    [name] => a
                )
            [12] => Array
                (
                    [id] => 101
                    [name] => b
                )
        )

    [2020] => Array
        (
            [1] => Array
                (
                    [id] => 102
                    [name] => c
                )
            [2] => Array
                (
                   [id] => 103
                   [name] => d
                )
        )
)

К сожалению, я получаю только один с одним "ответвлением":

Array
(
    [2019] => Array
        (
            [12] => Array
                (
                    [id] => 101
                    [name] => b
                )
        )

    [2020] => Array
        (
            [2] => Array
                (
                   [id] => 103
                   [name] => d
                )
        )
)

Чего здесь не хватает? почему предыдущие строки исчезают из структуры?

Ответы [ 2 ]

2 голосов
/ 18 апреля 2020

Если вы хотите, чтобы год и месяц использовались в качестве основных индексов, вам необходимо использовать оба из них при добавлении данных в $tree ...

$tree = array();
foreach ($arr as $row) {
    $tree[$row['year']][$row['month']] = [   'id' => $row['id'],
            'name' => $row['name']];
}

с вашими тестовыми данными, это дает ...

Array
(
    [2019] => Array
        (
            [9] => Array
                (
                    [id] => 100
                    [name] => a
                )

            [12] => Array
                (
                    [id] => 101
                    [name] => b
                )

        )

    [2020] => Array
        (
            [1] => Array
                (
                    [id] => 102
                    [name] => c
                )

            [2] => Array
                (
                    [id] => 103
                    [name] => d
                )

        )

)
0 голосов
/ 18 апреля 2020

Вы ошиблись в именах ключей - bl_year, bl_month не существует:

foreach ($arr as $row) {
    $tree[$row['year']] = array(
        $row['month'] => array (
            'id' => $row['id'],
            'name' => $row['name'],
        ),
    );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...