Добрый день. Имеется база со структурой
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 и до последней вложенности). Как это сделать циклом?
Вижу такой алгоритм:
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;
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
Добрый деньНужно найти в текстовом файле любого размера подстроку, и вернуть первую найденную полную строку в которой содержится подстрока