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

332
27 декабря 2016, 02:35

Добрый день. Имеется база со структурой

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 и до последней вложенности). Как это сделать циклом?

Answer 1

Вижу такой алгоритм:

  1. Левел = 0
  2. Массив родителей = [0]
  3. Присвоить столбцу level значение Левел для parent_id IN Массив родителей
  4. Получить все значения id для parent_id IN Массив родителей
  5. Левел + 1
  6. Массив родителей = массиву id из 4 пункта
  7. Если Массив родителей не пустой перейти к 3 пункту
Answer 2

function update_level($id) { 
	global $db, $tabl_prefix, $city_i_down; 
	if($id > 0) { 
		$wh = "id = '{$id}'"; 
	} else { 
		$db->query("UPDATE `" . $tabl_prefix . "_city` SET level = '1'"); 
		$wh = "parent_id > '0'"; 
    } 
	$result = $db->query ( "SELECT level, id, parent_id FROM `" . $tabl_prefix . "_city` WHERE {$wh}" ); 
	while ( $row = $db->get_row ( $result ) ) { 
		$suffix = 1; 
		$parent_id = $row['parent_id']; 
		if ( $parent_id > 0 ) { 
			do { 
				$suffix++; 
				$parent_id = $city_i_down[$parent_id] ['parent_id']; 
			} while ( $parent_id > 0 ); 
		} 
		$db->query("UPDATE `" . $tabl_prefix . "_city` SET level = '{$suffix}' WHERE id = '{$row['id']}'"); 
	} 
}

Вот готовая функция.

  • $id - входной ID (если задан)
  • $db - класс для выполнения запроса (класс mysqli)
  • $tabl_prefix - просто префикс к таблице. Это видно.
  • $city_i_down - это многомерный массив, содержащий данные всей таблицы. Он формируется вот так.

$city_i_down = array (); 
$result = $db->query ( "SELECT * FROM `" . $tabl_prefix . "_city`); 
while ( $row = $db->get_row ( $result ) ) { 
    $city_i_down [$row ['id']] = array (); 
    foreach ( $row as $key => $value ) 
        $city_i_down [$row ['id']] [$key] = $value; 
}

READ ALSO
PHP Поиск в текстовом файле любого размера [требует правки]

PHP Поиск в текстовом файле любого размера [требует правки]

Добрый деньНужно найти в текстовом файле любого размера подстроку, и вернуть первую найденную полную строку в которой содержится подстрока

365
Подсчет одинаковых значений в MySQL

Подсчет одинаковых значений в MySQL

Как подсчитать одинаковые строки в таблице comments?

532
Удалить www. из url

Удалить www. из url

необходимо удалить из доменного имени www

369
Перемотка видео не по шкале JS

Перемотка видео не по шкале JS

ЗдравствуйтеРебят не могу разобраться

425