Доброго времени суток Уважаемые. 1й вопрос скорей всего относится к mysql, но все же мне кажется реализация его только на mysql невозможна, начну: В общем имею следующую таблицу, вот такой вот структуры: id name parent_id 1 Category 0 2 SubCat 1 3 SubSubCat 2 Надо вывести эти данные деревом, т.е. в таком порядке Category SubCat SubSubCat При этом мы знаем ID только последней записи, остальные беруться от parent_id, возможно ли такое реализовать посредствам только mysql, т.е. одним запросом или несколькими вложеными запросами? Если нет, то как это сделать с помощью php, я так понимаю тут прийдется прибегнуть к рекурсии? 2й вопрос по поводу распаковки zip архива на сервере, использую для примера следующий код: PHP: <?php $zip = new ZipArchive; if ($zip->open('test.zip') === TRUE) { $zip->extractTo('/my/destination/dir/'); $zip->close(); echo 'ok'; } else { echo 'failed'; } ?> при это файлы рапаковываются, но если есть существующие то не заменяются, как сделать чтобы они заменялись ?
1) Использовать другой способ хранения дерева. Тогда можно будет обойтись только 1 запросом. В данном случае придётся загрузить всё дерево и прибегнуть к рекурсии.
спасибо конечно за мануал, пока его не читал, позже прочту, а пока что как вариант сделал функцию рекурсии: PHP: <?php function obhod($id){ $query = "SELECT * FROM `cat` WHERE `id`=$id"; $result = mysql_query($query); $data = mysql_fetch_array($result); if ($data['parent'] == 0){ echo $data['name']; // Выводим главную категорию return 0; } else{ obhod($data['parent']); echo " -> ".$data['name']; // Выводим под категории } } obhod(3); // Вызываем функцию с id 3 ?> На выходе получим следующее: Код (Text): Category -> SubCat -> SubSubCat Жду Ваших комментариев
Можно выбрать все дерево одним запросом: PHP: <? // Выбираем все узлы $res = mysql_query('SELECT * FROM nodes ORDER BY pid ASC, name DESC'); $order = $nodes = array(); while ($node = mysql_fetch_object($res)) { // Если родитель есть, то наш уровень будет родительский + 1 $node->level = isset($nodes[$node->pid]) ? $nodes[$node->pid]->level + 1 : 0; // Добавляем узел в список $nodes[$node->id] = $node; // Находим новую позицию для нашего узла: // Ищем родителя $parent_pos = array_search($node->pid, $order); // Если родитель есть, то тавим сразу после него, если нет, то в начало списка $pos = $parent_pos !== false ? $parent_pos + 1 : 0; // Вставляем номер узла в $order $order = array_merge(array_splice($order, 0, $pos), array($node->id), $order); } foreach ($order as $id) { echo str_repeat(" ", $nodes[$id]->level * 4) . " " . $nodes[$id]->name . "<br />\n"; } Где, $order — порядок отображения узлов, $nodes — их данные.