Construirea unui arbore ierarhic cu PHP și MySQL

Luați în considerare un exemplu de construire a unui arbore ierarhic (în formă extinsă) pe baza informațiilor dintr-o bază de date folosind PHP și MySQL. Cheia pentru rezolvarea acestei probleme este utilizarea unei funcții recursive. Ierarhia partițiilor va fi stocată într-un tabel de bază de date MySQL.

Captura de ecran de mai jos arată acest tabel (catalog):

ierarhic
Structura ierarhică a partiției este stocată în baza de date MySQL

id - cheia primară a tabelului pid - id-ul secțiunii părinte

Să scriem următorul script PHP:

1. Fișier dbopen.php (deschide o conexiune la MySQL)

2. Fișier Index.php (script principal)

Toată munca este realizată de funcția recursivă ShowTree(). Captura de ecran de mai jos arată un exemplu despre cum funcționează index.php:

este
Rezultatul index.php

Un exemplu de proiect este atașat: phptree.zip Autor script: Yuri Khristoforov

este

ierarhic

construirea

Dacă am înțeles bine, atunci cu fiecare iterație se accesează baza de date. În opinia mea, aceasta nu este o practică foarte bună. Dacă cuibărirea copacului este mare, atunci este costisitor ... În ceea ce mă privește, este mai bine să scoateți toate datele simultan și apoi să construiți un arbore în php în funcție de datele primite sau să stocați copacii într-un fişier. Dacă, de exemplu, trebuie să construiți un meniu de site, puteți arunca totul într-un fișier ini sau xml sau json sau yaml și apoi pur și simplu să le înregistrați pe toate odată.

Ideea este bună, poți da un exemplu de implementare?

Prefer modul fișierului de configurare.. Folosesc Zend Framework peste tot acum. Există o componentă Zend_Config_Writer acolo. Adică, atunci când trebuie să editați fișierul de configurare, utilizați-l. Și când trebuie să utilizați configurația, luăm pur și simplu Zend_Config, care scoate arborele terminat din fișierul de configurare sub forma unui tablou. Din câte știu eu, accesarea unui fișier PHP face mai mult decât accesarea unei baze de datedate .. Desi nu voi spune sigur ..

Desigur, puteți folosi instrumente similare din alte biblioteci .. Principiul principal aici este ...

Iată un exemplu de procesare a rezultatului unei selecții din baza de date: $queryResult = array( array('id' => 1, 'parent_id' => 11, 'page') => „News_1. 1’), array('id' => 2, 'parent_id' => 0, 'page' => 'Index'), array('id' => 3, ' parent_id' => 17, 'page' => 'News_1.2.1'), array('id' => 5, 'parent_id' => 0, 'page' => „Știri’ ), array('id' => 7, 'parent_id' => 17, 'page' => 'News_1.2.3'), array('id' => 8, ' parent_id' => 17, 'page' => 'News_1.2.2'), array('id' => 9, 'parent_id' => 0, 'page' => „Despre” ), array(„id” => 11, „parent_id” => 5, „pagina” => „News_1”), array(„id” => ; 17, „parent_id” => 11, „page” => „News_1.2”), );

function tree($treeArray, $pid = 0) if (! $treeArray) return; > foreach($treeArray ca $item) if ($item['parent_id'] == (int) $pid) echo($item['page'] . '') ; tree($treeArray, $item['id']); > > >

arbore($queryResult); Nu pot garanta că este cea mai bună soluție, dar totuși...

Multumesc Andrei. Desigur, ar trebui să încerci toate acestea.

Și eu folosesc ajax, deci arborele meu nu este scump, doar că costurile merg doar la desenarea unei ramuri deschise, care inițial se deschide astfel încât motorul de căutare să înțeleagă unde ne aflăm în arbore, restul se încarcă prin json prin ajax. Deci desenul copacului pe client merge :-))

rastakoy, poți să arăți cum este implementat pentru tine?

și ce să arăți acolo... totul este elementar simplu.. 1. Aruncă, de exemplu. la înregistrarea bazei de date cu câmpurile id, navigation_title, parent_id. 2. Apoi, când faceți clic pe elementnavigare, trimitem o cerere ajax, prin aceeași jquery, și trecem id-ul articolului pe care s-a făcut clic ca parametru... 3. pe server, luăm toate elementele de meniu din baza de date, unde parent_id = id-ul nostru, pe care l-am primit ca parametru, trimitem datele răzuite înapoi în format json ... 4. Pe pagina de la care a fost trimisă cererea ajax, primim un răspuns, iar dacă primim un obiect json negol, construim un arbore DOM folosind javascript...

p.s. în loc de o bază de date, puteți lua date din acea matrice php, sau un fișier json, puteți, dacă implementați un sistem de cache complet conform Feng Shui .. pe scurt, o mulțime de lucruri pot fi...