За последние 24 часа нас посетили 20792 программиста и 1723 робота. Сейчас ищут 1422 программиста ...

Требуется помощь в написании цикла.

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

  1. igramnet

    igramnet Активный пользователь

    С нами с:
    16 дек 2013
    Сообщения:
    17
    Симпатии:
    0
    Добрый день. Имеется база со структурой

    Код (Text):
    1. CREATE TABLE `catalog_city` (
    2.   `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
    3.   `parent_id` int(8) NOT NULL DEFAULT '0',
    4.   `name` varchar(250) NOT NULL DEFAULT '',
    5.   `level` tinyint(2) NOT NULL,
    6.   PRIMARY KEY (`id`)
    7. ) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
    8.  
    9. INSERT INTO `catalog_city` VALUES ('1', '0', 'Россия', '0');
    10. INSERT INTO `catalog_city` VALUES ('2', '0', 'Беларусь', '0');
    11. INSERT INTO `catalog_city` VALUES ('3', '2', 'Минск2', '0');
    12. INSERT INTO `catalog_city` VALUES ('4', '1', 'Минск2', '0');
    На самом деле количество записей измеряется тысячей, а уровень вложения не известен. Требуется проставить уровень вложения в колонку level (от 0 и до последней вложенности). Как это сделать циклом?
     
  2. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.584
    Симпатии:
    1.762
    А сразу проставлять никак? Вообще, здесь не цикл нужен, а рекурсия. При таких исходных
     
  3. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    так его надо расчитать же... сам по себе он не появится в бд.
     
  4. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    Какой parent_id у не вложенных элементов?
    Можно попробовать вытаскивать сначала их, потом их детей, потом внуков и так пока не закончится родословная.
    А есть уверенность в том, что нет детей без родителей?
     
  5. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Нужно выбрать с сортировкой
    Код (Text):
    1. SELECT * FROM `table` ORDER BY `parent_id`,`id`
    потом так
    Код (PHP):
    1. $currentLevel = 1;
    2. $onLevel = [];
    3. $newLevel = [];
    4.  
    5. foreach ($all as &$row) {
    6.   if ($row['parent_id'] ==0) {
    7.     $onLevel[] = $row['id'];
    8.     continue;
    9.   }
    10.   if (in_array($row['parent_id'], $onLevel)) {
    11.      $row['level'] = $currentLevel;
    12.      $newLevel[] = $row['id'];
    13.      continue;
    14.   }
    15.   $currentLevel++;
    16.   $row['level'] = $currentLevel;
    17.   $onLevel = $newLevel;
    18.   $newLevel = [];
    19. }
    20.  
    21. print_r($all);
    вроде бы