За последние 24 часа нас посетили 72882 программиста и 10233 робота. Сейчас ищут 2802 программиста ...

Не могу сформировать вложенный массив рекурсией

Тема в разделе "PHP для новичков", создана пользователем rotting, 6 окт 2016.

  1. rotting

    rotting Новичок

    С нами с:
    6 окт 2016
    Сообщения:
    1
    Симпатии:
    0
    Вот рекурсивная функция:
    PHP:
    1. public function build_tree($cats){
    2.         foreach ($cats as $cat)
    3.         {
    4.             $result = (new \yii\db\Query())
    5.                 ->select(['id', 'name', 'parent_id', 'guid'])
    6.                 ->from('category')
    7.                 ->where(['parent_id' => $cat['id']])
    8.                 ->all();
    9.             $i = 1;
    10.             $dats = array();
    11.             foreach ($result as $dat) {
    12.                     $cat_detail['text'] = $dat['name'];
    13.                     $cat_detail['href'] = \yii\helpers\Url::to(['', 'id' => trim($dat['id'])]);
    14.                     $cat_detail['parent_id'] = $dat['parent_id'];
    15.                     $cat_detail['guid'] = $dat['guid'];
    16.                     $cat_detail['id'] = trim($dat['id']);
    17.                     $dats[$i] = $cat_detail;
    18.                     $i++;
    19.             }
    20.             $this->build_tree($dats);
    21.             $cat['nodes'] = $dats;
    22.         }
    23.         return $cats;
    24.     }
    Вот так ее вызываю:
    PHP:
    1. $result = (new \yii\db\Query())
    2.             ->select(['id', 'name', 'parent_id', 'guid'])
    3.             ->from('category')
    4.             ->all();
    5.         $cats = array();
    6.         $i=1;
    7.         foreach ($result as $cat) {
    8.             if (empty($cat['parent_id'])) {
    9.                 $cat_detail['text'] = $cat['name'];
    10.                 $cat_detail['href'] = \yii\helpers\Url::to(['', 'id' => trim($cat['id'])]);
    11.                 $cat_detail['parent_id'] = $cat['parent_id'];
    12.                 $cat_detail['guid'] = $cat['guid'];
    13.                 $cat_detail['id'] = trim($cat['id']);
    14.                 $cats[$i] = $cat_detail;
    15.                 $i++;
    16.             };
    17.         }
    18.         $tree = $this->build_tree($cats);
    Но эта строчка $cat['nodes'] = $dats; как будто игнорируется, что я не так делаю?
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.213
    Симпатии:
    1.711
    Адрес:
    Молдова, г.Кишинёв
  3. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.843
    Симпатии:
    1.338
    Адрес:
    Лень
    в чем логика в $cat['nodes'] = $dats; так и не понял, за то конфликт есть
    PHP:
    1. foreach ($cats as $cat)
    2. {
    3. $cat['nodes'] = $dats;
    4. }
    array ( nodes )
    перезаписать, перезаписать, перезаписать, перезаписать, перезаписать, перезаписать, перезаписать, и т.д. сам массив nodes при этом ни где не используется. Тогда как определил то что строка игнорируется? в деле она не игнорируется, а переменная не используется. Мб я долблюсь в глаза и не вижу чего то..
     
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.497
    Симпатии:
    1.726
    Я думаю, дело в том, что аргумент - не ссылка, поэтому не перезаписывается. А вообще, это не хорошо, делать запросы в рекурсивной функции. Лучше использовать какой-нибудь метод хранения деревьев в таблицах, как Nested Sets или materialized Path, особенно потому что есть готовые реализации для yii этих вещей. И логика вызывающей функции тоже нарушена. Вы сначала считываете вообще все категории, всех уровней, а потом для каждой хотите дерево потомков