Побудова дерева категорій на php

Побудова дерева категорій на php

Сьогодні я розповім, як на PHP і MySQL створювати ієрархічне дерево.

Взагалі вони будуються де тільки можливо. Головне правильно його побудувати і застосувати.

Створимо таблицю, виконавши SQL-запит в PHPMyAdmin:

Тепер потрібно заповнити нашу таблицю записами. В результаті, повинна вийде приблизно така таблиця:

Побудова дерева категорій на php

Можна заповнити тестову таблицю запитом:

З базою даних все! Далі йдемо до формування самого дерева розділів.

Зробимо запит і сформуємо зручний масив для подальшої роботи.

Зараз будемо будувати дерево. Для побудови будемо використовувати рекурсивную функцію.

Ієрархічне дерево матиме таку структуру:

Створимо рекурсивную функцію build_tree (). Вона будуватиме наше ієрархічне дерево абсолютно будь-якої вкладеності.

Для побудови дерева, в коді прописуємо:

Так ось в два кроки ми створили ієрархічне дерево розділів сайту і не важливо скільки там розділів!

Для побудови такого дерева запускаємо функцію build_tree c такими параметрами:

Велике спасибі за відповідь.
Якщо можна, ще одне питання. А як в такому випадку створювати лінки на каталоги? В БД вносити повні шляхи, наприклад запис для Розділу 1.1.1
«Раздел_1 / Подраздел_1.1 / Подраздел_1.1.1 /»
або краще вносити запис тільки для даного підрозділу, тобто «Подраздел_1.1.1». Якщо друге, то як їх потім об'єднати?

Максим Нікіфо $ LastName = htmlspecialchars ($ _ POST [ 'LastName']);
$ Name = htmlspecialchars ($ _ POST [ 'name']);
$ Floor = $ _POST [ 'floor'];
$ Email = mysql_real_escape_string ($ _ POST [ 'email']);
$ Password = md5 ($ _POST [ 'password']);
$ Phone = $ _POST [ 'phone'];
$ Data = $ _POST [ 'data'];
$ Country = $ _POST [ 'country'];
$ Region = $ _POST [ 'region'];
$ City = $ _POST [ 'city'];
$ Rdate = date ( «Y-m-d H: i: s»);

це все круто звичайно. Але працює тільки якщо у вас рейтингів не більше 100

У мене в базі 40 тисяч записів. Такий метод не актуальний, бо розрахунок відбувається майже 10 хвилин. Жодна людина не буде чекати при переході по сторінках коли трапиться «чудо» і сервер прорахує ЦЕ.

Запитайте, чому так багато? Мені потрібно побудувати дерево регіонів - міст. за схемою СВІТ - КРАЇНА - ОБЛАСТЬ (штат / округ) - населений пункт. Що б не займало багато місце, нащадки ховаються під вкладений список батьків, і відображаються лише при натисканні на батька (список розкривається).

Як вирішити цю задачу, ще не придумав, є ідеї?

Ну під «глобальні завдання», потрібні і «глобальні сервера».
А взагалі, вам тут рекурсія не потрібна. У вас відома глибина вкладеності - три (світ, країна, область). Ось і робіть виходячи з вкладеності.

Потрібно завжди робити вибірку саме тієї інформації, яка потрібна користувачу. Технологія ajax Вам на допомогу.
Можна вибірку розділити на етапи використовуючи ajax. Вибираєте спочатку континент (за вибором йде ajax-запит з id континенту і повертається список країн, його вставляєте в следуйщій selest), при виборі країни довантажувати вже регіони і т.д. Так будуть запити набагато менше, і не буде вибірок не потрібною користувачеві інформації.

Найреальніше і зрозуміле побудова дерево, з усіх які раніше зустрічав. Дякуємо!

Дякуємо. дуже допомогли)

Дякую за статтю. Майже те, що шукав, але не можу вирішити проблему з пагінацією. Масив формується майже правильно, сама функція виводить в обрізаному вигляді, через те, що деяких елементів немає в батьківському масиві. Хоча б натрапимо як вирішити проблему.

Підрозділ 2 -> Підрозділ 2.1 -> Підрозділ 2.1.2

Та й при тому що build_tree ($ cats, 2); то показує все правильно, але у мене ніяк не виходить порахувати, хелпмі плиз.

Спасибі вам! Дуже корисна річ, але цікавить одне питання.

Розділ 1
-розділ 1.1
-Розділ 1.1.1
-розділ 1.2
розділ 2
-розділ 1.1
-розділ 1.2
розділ 3
-розділ 3.1

і ми хочемо видалити -Розділ 1.1 то в цьому випадку розділ Розділ 1.1.1 і все його нащадки повинні будуть зміститися на рівень і повинно вийти:

Розділ 1
-розділ 1.1.1
-розділ 1.2
розділ 2
-розділ 1.1
-розділ 1.2
розділ 3
-розділ 3.1

далі ми вирішили видалити Розділ 2 і у нас повинно вийти:

Розділ 1
-розділ 1.1.1
-розділ 1.2
розділ 1.1
розділ 1.2
розділ 3
-розділ 3.1

підкажіть будь ласка необхідні запити до БД або логіку на PHP. Дякуємо!

Алладін, код для візуального тесту:

Добрий день Максим сорри за тупе питання дерево зробив а як визначити глибину мені потрібно 5 рівнів і не більше

Чи можна як то прописати стилі для цього і зробити акордеон? :)

а як розгорнути всю гілку?
Наприклад у мене 3 рівня вкладеності
При кліці на 1-й рівень передається id = 1, як мені перевірити чи є у цього батька нащадки що б вивести інформацію
Роблю висновок за допомогою ajax

Ну і вибірка для виведення:

yura,
дайте структуру таблиць в БД

Айболить,
порожні 03 і 05 а один ти повернув

А як додати клас css. що б як то відзначити ті пункти у яких є підпункти, або хоча б +/-

Доброго вам дня!

Схожі статті