Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Pobieranie struktury drzewiastej
Forum PHP.pl > Forum > PHP
szalik
Witam,
mam problem z pobieraniem z bazy struktury drzewiastej. Mianowicie, mam taką tabele w bazie:
PAGES:
> id
> created
> title
> body
> position
> children

position odpowiada za pozycję, a w children jest id do ktorego ma być podpięty element menu.
Wyświetlam tak główne elementy:

<?php
$pages = $db->query_select("SELECT * FROM `pages` WHERE `children` = '0' GROUP BY `position` ORDER BY `position`");
foreach($pages as $page) {
echo $page['title'].' position: '.$page['position'].'<br />';

}
?>

Ale kompletnie nie mam pomysłu jak wyświetlać podelementy tymbardziej, że chciałbym aby mozna było nieskończenie podpinać podelementy. Np dla takiej struktury:
| 1 | 12.06.2008 12:34 | title 1 | dasdasdas | 1 | 0 |
| 2 | 12.06.2008 12:34 | title 2 | dasdasdas | 2 | 1 |
| 3 | 12.06.2008 12:34 | title 3 | dasdasdas | 3 | 2 |
| 4 | 12.06.2008 12:34 | title 4 | dasdasdas | 4 | 2 |
| 5 | 12.06.2008 12:34 | title 5 | dasdasdas | 5 | 0 |
| 6 | 12.06.2008 12:34 | title 6 | dasdasdas | 6 | 5 |

Wyświetlane byłoby coś takiego:
title 1
> title 2
>> title 3
>> title 4
title 5
> title 6

Mógłby mnie ktoś naprowadzić winksmiley.jpg?
Z góry dzięki i pzodrawiam,
Kamil
wookieb
Najpierw pobierasz glowna galaz co juz masz. Potem dla kazdego elementu galezi pobierasz jego dzieci i tak caly zcas. Przy dużej ilości może być z tym problem dlatego polecam dla tego celu drzewa left right. Teorii na ten temat jest baardzo dużo.
Mikz
Źle to rozwiązałeś. Chociaż nie bardzo rozumiem o co Ci chodzi z "w children jest id do ktorego ma być podpięty element menu", children to liczba mnoga :-). Ale wydaje mi się że to może Ci pomóc:
Jeśli chcesz mieć nieskończoną liczbę elementów, musisz zrobić tzw. relację jeden do wielu, czyli:

PAGES:
> id
> created
> title
> body
> position

PAGE_CHILDREN:
> id:
> pola_jakie_chcesz:
> page_id:

I wybieranie jest proste: "SELECT * FROM `page_children` WHERE `page_id` = 'tu_id_strony' --tu sortowania i inne;
Jeśli chcesz pobrać jedno dziecko to: "SELECT * FROM `page_children` WHERE `page_id` = 'tu_id_strony' ORDER BY `kolumna` LIMIT 0,1;

Ewentualnie, jeśli to PAGE jest dzieckiem PAGE, robisz inaczej:

PAGES:
> id
> created
> title
> body
> position
> parent_id

I wtedy pobierasz tak: "SELECT * FROM `pages` WHERE `parent_id` = 'tu_id_strony' --tu sortowania i inne;
I pojedyncze pobieranie analogicznie do poprzedniego przykładu.

No, przynajmniej tak mówi zasada relacyjności w bazach. Poczytaj sobie o tym :-).

W ogóle sam osobiście zawsze polecam używanie ORMów, to jest zdecydowanie wygodniejsza bez-zapytaniowa i dosyć bezbolesna metoda korzystania z baz danych. A w ogóle to najlepiej symfony+propel i życie staje się prostsze :-).

Pozdrawiam
bełdzio
looknij http://www.beldzio.com/drzewka
szalik
Wykorzystałem rozwiązanie beldzia ale jak to teraz wyświetlić aby miało wcięcia, ładna pętla w php nie działa ;/

Z góry dzięki,
Kamil
wookieb
To rozwiązanie bełdzia nazywa się właśnie drzewem LEFT RIGHt o którym oczywiście nie poczytałeś w googlach..
http://artykuly.zyxist.com/czytaj.php/drzewa_w_php_i_mysql pierwszy link w googlach. To było takie trudne?
szalik
Znalazłem tego sajta lecz kod jest strasznie niejasny, mógłby mi ktoś podpowiedzieć jak stworzyć tablice z wyników zapytania z porady beldzia. Aby wyniki były zapisane np. w taki sposób:

$tree = array(
0 => array(
'tag' => 'NavigationMode',
'value' => array(
0 => array(
'tag' => 'Title',
'value' => 'Introduction'
),
1 => array(
'tag' => 'NavigationNode',
'value' => array(
0 => array(
'tag' => 'Title',
'value' => 'Sub Intro'
)

)
)
)
),
1 => array(
'tag' => 'NavigationMode',
'value' => array(
0 => array(
'tag' => 'Title',
'value' => 'Module 1'
)
)
)
);

Z góry dzięki,
Kamil
wookieb
Oho. Wręcz przeciwnie. Jest bardzo jasno napisany.
Skopiuj go. Pobaw się to będziesz miał wszystko jasne. Nie nikt nie może ci podać rozwiązania bo dostałeś gotowce a skoro ich nie umiesz używać to tym bardziej nie będziesz w stanie użyć nawet naszej pomocy. Pora ruszyć tyłek i pomyśleć.
bełdzio
na blogasku masz pokazane jak robić wcięcia, możesz wykorzystać ten sposób który został tam wykorzystany, albo po prostu w pętl wypisującej dane sprawdząc wartośc pola `level` i jeśli się zmieni to odpowiednio dodawac / zmniejszać wcięcie
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.