Я использую эту категорию script:
<?php
include("connect.php");
$nav_query = mysql_query("SELECT * FROM `categories` ORDER BY `id`");
$tree = "";
$depth = 1;
$top_level_on = 1;
$exclude = array();
array_push($exclude, 0);
while ($nav_row = mysql_fetch_array($nav_query)) {
$goOn = 1;
for ($x = 0; $x < count($exclude); $x++) {
if ($exclude[$x] == $nav_row['id']) {
$goOn = 0;
break;
}
}
if ($goOn == 1) {
$tree .= $nav_row['name'] . "<br>";
array_push($exclude, $nav_row['id']);
if ($nav_row['id'] < 6) {
$top_level_on = $nav_row['id'];
}
$tree .= build_child($nav_row['id']);
}
}
function build_child($oldID) {
global $exclude, $depth;
$child_query = mysql_query("SELECT * FROM `categories` WHERE parent_id=" . $oldID);
while ($child = mysql_fetch_array($child_query)) {
if ($child['id'] != $child['parent_id']) {
for ($c=0; $c < $depth; $c++) {
$tempTree .= " ";
}
$tempTree .= "- " . $child['name'] . "<br>";
$depth++;
$tempTree .= build_child($child['id']);
$depth--;
array_push($exclude, $child['id']);
}
}
return $tempTree;
}
echo $tree;
?>
Он основывается на следующей структуре базы данных mysql:
id | parent_id | name
1 Cats
2 1 Siamese Cats
3 2 Lilac Point Siamese Cats
4 Dogs
etc...
script допускает неограниченную глубину категории, но имеет одно крупное падение. Он отображает навигацию категорий на передний конец следующим образом:
Cats
- Siamese Cats
- Lilac Point Siamese Cats
Dogs
Как я могу его отобразить следующим образом:
Cats
- Siamese Cats
- Lilac Point Siamese Cats
Dogs
Итак, для каждой дополнительной категории глубина еще одно пространство, которое будет добавлено в начало отступа текста категории?
Поскольку вы уже отслеживаете глубину, используйте ее. Например.
$indent = '';
for($i = 0; $i < $depth; $i++) {
$indent .= " ";
}
$tempTree .= $indent . "- " . $child['name'] . "<br>";
Чтобы он выглядел так, как вам нужно, вам может потребоваться инициализировать $depth
с помощью 0
.
Также обратите внимание, что выполнение SQL-запросов во вложенном цикле for
не лучший подход. Если возможно, попробуйте уменьшить количество запросов.
Вы можете, например, использовать классы и, сразу получить все записи, а затем построить древовидную структуру с объектами и массивами.