Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP][MySQL] Budowanie drzewa
rolnix
post
Post #1





Grupa: Zarejestrowani
Postów: 115
Pomógł: 0
Dołączył: 16.04.2005
Skąd: Białowieża

Ostrzeżenie: (0%)
-----


Witam.

Zaszła potrzeba utworzenia tablicy drzewa wielopoziomowego za pomocą jak najmniejszej liczby zapytań. Przykładowa tabela:

Kod
id     parent_id    title  
1      0            Artykuły
2      1            Na temat 1
3      1            Na temat 2
4      2            Na podtemat 1
5      2            Na podtemat 2


Celem jest utworzenie tablicy o strukturze:

Kod
Array
(
    [0] => Array
        (
        ["name"] =>  "Artykuły"
        ["items"] => Array
                   (
                         [0] => Array
                         (
                         ["name"] =>  "Na temat 1"
                         ["items"] =>  Array
                                       (
                                             [0] => Array
                                                    (
                                                    ["name"] =>  "Na podtemat 1"
                                                    )
                                             [1] => Array
                                                    (
                                                    ["name"] =>  "Na podtemat 2"
                                                    )
                                       )
                         )
                         [1] => Array
                         (
                         ["name"] =>  "Na temat 2"
                         )
                   )
        )

)


Google podaje mi tylko jakieś wielkie klasy, które operują tylko na memberach obiektu, ew. poprzez rekurencję wykonują więcej zapytań SQL.

Pytanie:

Czy ktoś ma pomysł, jak zbudować takie drzewo z pomocą jednego tylko zapytania, tzn SELECT * FROM categories?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
barman
post
Post #2





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 8.10.2007
Skąd: Piekary Śląskie

Ostrzeżenie: (0%)
-----


Witam. Sam musiałem sobie poradzić z identycznym problemem kilka dni temu, więc chętnie udzielę pomocy.
Jednorazowy kod można zmieścić w niecałych 30 linijkach, a ubranie go w klasę nie powinno być trudnym zadaniem.

  1. <?php
  2. $AR = new AssocResult ('select * from structure', $DBHandle);
  3. // (ja osobiscie pobieram dane w taki sposob, tutaj nalezy wkleic dowolny kod p
    rzegladajacy wynik wiersz po wierszu)
  4. foreach ($AR as $aVal) {
  5. $Parent = $aVal['parent_id'];
  6. // wstepne ulozenie danych
  7. $Data[$Parent][] = $aVal;
  8. }
  9.  
  10. // $TopID - glowna kategoria drzewa
  11. function BuildStructure ($TopID, $Data) {
  12. $Output = array ();
  13. // sprawdza, czy kategoria zawiera podkategorie
  14. if (! empty ($Data[$TopID])) {
  15. foreach ($Data[$TopID] as $sVal) {
  16. $CurrentRow = $sVal;
  17. // rekurencyjnie buduje podkategorie
  18. $Items = BuildStructure ($sVal['id'], $Data);
  19. if (! empty ($Items)) {
  20. $CurrentRow['items'] = $Items;
  21. }
  22. $Output[] = $CurrentRow;
  23. }
  24. }
  25. return ($Output);
  26. }
  27.  
  28. // zmienna $Output zawiera strukture drzewa
  29. $Tree = BuildStructure (0, $Data);
  30. ?>


Ten post edytował barman 12.11.2007, 08:11:42
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 13.10.2025 - 07:21