Добрый день. Имеется база со структурой Код (Text): CREATE TABLE `catalog_city` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `parent_id` int(8) NOT NULL DEFAULT '0', `name` varchar(250) NOT NULL DEFAULT '', `level` tinyint(2) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; INSERT INTO `catalog_city` VALUES ('1', '0', 'Россия', '0'); INSERT INTO `catalog_city` VALUES ('2', '0', 'Беларусь', '0'); INSERT INTO `catalog_city` VALUES ('3', '2', 'Минск2', '0'); INSERT INTO `catalog_city` VALUES ('4', '1', 'Минск2', '0'); На самом деле количество записей измеряется тысячей, а уровень вложения не известен. Требуется проставить уровень вложения в колонку level (от 0 и до последней вложенности). Как это сделать циклом?
Какой parent_id у не вложенных элементов? Можно попробовать вытаскивать сначала их, потом их детей, потом внуков и так пока не закончится родословная. А есть уверенность в том, что нет детей без родителей?
Нужно выбрать с сортировкой Код (Text): SELECT * FROM `table` ORDER BY `parent_id`,`id` потом так Код (PHP): $currentLevel = 1; $onLevel = []; $newLevel = []; foreach ($all as &$row) { if ($row['parent_id'] ==0) { $onLevel[] = $row['id']; continue; } if (in_array($row['parent_id'], $onLevel)) { $row['level'] = $currentLevel; $newLevel[] = $row['id']; continue; } $currentLevel++; $row['level'] = $currentLevel; $onLevel = $newLevel; $newLevel = []; } print_r($all); вроде бы