Как сделать этот тип приращения в PHP?

0

Я использую эту категорию 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 .= "&nbsp;";
                        }
            $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

Итак, для каждой дополнительной категории глубина еще одно пространство, которое будет добавлено в начало отступа текста категории?

  • 0
    С некоторыми довольно аккуратными запросами вы можете сделать так, чтобы ваш SQL выполнял большую часть работы: dev.mysql.com/tech-resources/articles/hierarchical-data.html
Теги:

1 ответ

0
Лучший ответ

Поскольку вы уже отслеживаете глубину, используйте ее. Например.

$indent = '';
for($i = 0; $i < $depth; $i++) {
     $indent .= "&nbsp;";
}
$tempTree .= $indent . "- " . $child['name'] . "<br>";

Чтобы он выглядел так, как вам нужно, вам может потребоваться инициализировать $depth с помощью 0.


Также обратите внимание, что выполнение SQL-запросов во вложенном цикле for не лучший подход. Если возможно, попробуйте уменьшить количество запросов.

Вы можете, например, использовать классы и, сразу получить все записи, а затем построить древовидную структуру с объектами и массивами.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню