Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP/MYSQL] Struktura drzewa - wielokrotne zagniezdzenie
xajart
post
Post #1





Grupa: Zarejestrowani
Postów: 141
Pomógł: 1
Dołączył: 2.12.2008

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


Witam. 


Opracować musze drzewo o wielokrotnym zagniezdzeniu, jednak mi to nie wychodzi - pewnie z braku wiedzy w dziedzinie php. 

Mam tabele w takiej formie 

Id | sub | poziom | pozycja | name
3. | 0 | 0 | 1   | A 
2. | 1 | 1 |  1  | B
1. | 2 | 2 |   2 | C
4. | 2 | 2 |   1 | D
5. | 1 | 1 |  1  | E
6. | 0 | 0 | 0   | F


Struktura powinna wobec tego wyglądać tak:
A.
- B
-- D
-- C
- E
FRozpisałem sobie taki algorytm

Kod
for ($i=1; $i<=$rows; $i++){
  echo $id[$i];
 $t[] = NULL; 
 for ($j=1; $j<=rows; $j++){
  if ($sub[$j] == $id[$i] AND $sub[$j] != t[$j]){
   for ($k=0; $k<=count($t);$k++){
    echo $id[$j];
    $t[$j] == $id[$j]
   }
  }
 }
}


Niestety kod nie działa tak jak zamierzałem, z racji że nie wiem jak zdefiniować te tabele, bo mają pełnić one role taką że jeżeli znajdzie element w pętli J i wyświetli dany element, to ID tego elementu powinno zostać zapisane w BD, by algorytm mógł je pominąc przy kolejnym sprawdzaniu sprawdzaniu. Tylko. Zaś jak przejdzie do inkrementacji I to tabela powinna zostać wyczyszczona.



Nie wiem czy dobrze rozumuje, prosiłbym was o pomoc z rozwiązaniem tego, bo sobie nie potrafie z tym dać rady, co do powyższych tabel, to opcjonalnie powinno wystarczyć id i sub alternatywnie poziom określa poziom zagłębienia 0 - główne, 1 -pz pierwszy, 2 - pz drugi itd.

W sumie to zależy mi do zagłębienia do poziomu 3, ale jeżeli by realizowało to więcej zagłębień było by bardziej przyszłościowe, bym za pare miesięcy nie musiał się zastanawiać jak 4 poziom czy 5 zrealizować.

Ten post edytował xajart 23.01.2009, 11:21:04
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
xajart
post
Post #2





Grupa: Zarejestrowani
Postów: 141
Pomógł: 1
Dołączył: 2.12.2008

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


Maksymalnie tych zagłebień będzie 10, Co do ilości rekordów to zaledwie kilkanaście.

Co do skryptu, to jest mniejwięcej to tylko że wyświetla poziomy wg pozycji w stylu:
A
-- B
-- C
---- D

Jednak jeżeli wg sub dla D jest ustawione podpięcie do B to powinno wyglądać tak

A
-- B
---- D
-- C

Niestety ten skrypt tego nie zrobi bo nie odnosi się w żaden sposób do kolumny SUB

A mi własnie o to chodzi jak zrobić wyświetlanie hierarchi zagniezdzeń wg kolumn ID i SUB
gdzie
ID (identyfikator unikalny), 
SUB 0 - rodzic
- Sub 1 - potomek rodzica
-- Sub 2 - potomek Sub1
--- Sub 3 - potomek Sub2 
itd.


Wiem że lepiej by było rozwiązać to metodą LEFT RIGHT, ale wiem też że w jakiś sposób napewno się da to wykorzystać bo skoro ja to widze, to w programie też powinno dać się to wyświetlić w jakiś sposób, dotego jeszcze kolumna pozycja wskazuje na którym poziomie zagnierzdzenia jest potomek.

Wymyśliłem taki algorytm, tylko byłbym wdzięczny jak by mi go teraz ktoś pomógł przenieść na kod php.

Tabele ID i SUB odczytuje jako dwie zmienne tablicowe A i B

zm. $i  = 1 | 2 | 3 |  4 |  5 |  6  |  7
ID,   A [  2 | 7 | 8 | 20| 21 | 23 | 26 ] 
Sub, B [  0 | 0 | 2 | 7  | 8  | 20 | 2   ]

B[1] = 0 TAK wypisz A[1], gdzie A[1]=2
- szukaj w B[] elementu 2 (pomijając B[1]) JEST wypisz A[3], gdzie A[3] = 8
-- szukaj w B[] elementu 8 (pomijając B[1,3]) JEST wypisz A[5], gdzie A[5] = 21
--- szukaj w B[] elementu 21 (pomijając B[1,3,5]) NIEMA
-- szukaj w B[] elemenu 8 (pomijajac B[1,3,5]) NIEMA
- szukaj w B[] elementu 2 (pomijając B[1,3,5]) JEST wypisz A[7], gdzie A[7] = 26
-- szukaj w B[] elementu 26 (pomijając B[1,3,5,7]) NIEMA
- szukaj w B[] elementu 2 (pomijając B[1,3,5,7]) NIEMA
szukaj w B[] elementu 0 (pomijajac B[1,3,5,7]) JEST wypisz A[2], gdzie A[2] = 7
- szukaj w B[] elementu 7 (pomijając B[1,3,5,7,2]) JEST wypisz A[4], gdzie A[4] = 20
-- szukaj w B[] elementu 20 (pomijając B[1,3,5,7,2,4]) JEST wypisz A[6], gdzie A[6]=23
--- szukaj w B[] elementu 23 (pomijając B[1,3,5,7,2,4,6]) NIEMA
-- szukaj w B[] elementu 20 NIEMA
- szukaj w B[] elementu 7 NIEMA
szukaj w B[] elementu 0 NIEMA - koniec skryptu.

Nie udało mi się napisać własnego skryptu, ale znalazłem coś takiego w sieci:
Kod
function drzewoKategorii ($kategorie = null, $rodzicId = 0, $zaglebienie = 0, $wynik = null)
{
   if ($wynik == null)
      $wynik = array();
   if ($kategorie == null) {
      $query = "select * from kategorie order by rodzic_id, nazwa";
      $kategorie = DB::getAll($query);   
   }
   foreach ($kategorie as $kat) {
      if ($r["rodzic_id"] == $rodzicId) {
         $r["zaglebienie"] = $zaglebienie;
         $wynik[] = $kat;
         $wynik = drzewoKategorii ($kategorie, $kat["id"], ($zaglebienie+1), $wynik);
      }
   }
   return $wynik;
}
$drzewo = drzewoKategorii();
foreach ($drzewo as $galaz) {
   for ($i=0; $i<=$galaz["zaglebienie"]; $i++) {
      echo '-';
   }   
   echo $galaz["nazwa"].'<br/>';
}


Tylko mam z tym problem bo nieobsługuje mi klasy DB::getAll() - bo nie ma PEAR
funkcje foreach() też mi nie obsługuje. Macie może jakieś pomysły jak to przerobić (IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif)
Bo musze to skończyć do poniedziałku, bo zaczynaja mi się sesja i bedę z tym w plecy (IMG:http://forum.php.pl/style_emoticons/default/sad.gif)
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: 5.10.2025 - 20:44