Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Algorytm usuwania gałęzi drzewa - Nowe podejscie, na kolejce FIFO
Black-Berry
post
Post #1





Grupa: Zarejestrowani
Postów: 663
Pomógł: 6
Dołączył: 3.06.2007
Skąd: Kraków

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


Ostatnio siedziałem sporo nad utworzeniem struktury kategorii na stronie. Istnieje fajna metoda opisana tutaj - klik. Osobiście ma dla mnie to taką wadę, że nie mamy swobody przy przenoszeniu lub zamienianiu dowolnych gałęzi w drzewie. W mojej metodzie wykorzystuję uproszczoną strukturę bazy.

  1. +--------+--------+
  2. | id | parent |
  3. +--------+--------+

Ma to spore zalety. Najtrudniejsze jest jednak np. Usuwanie całej gałęzi. Moze się komuś przyda. Proszę też o jakieś komentarze. Dzięki kolejce FIFO pozbyłem się rekurencji. Ograniczyłem też ilość zapytań do bazy do liczby węzłów zawierających dzieci. Tak więc jeśli mamy np kategorie które zawierają dużą ilość artykułów ( Zazwyczaj tak jest, że mamy o wiele mniej kategorii niż artykułów ) to jest to całkiem wydajna metoda. Udało mi się zaimplementować taki algorytm: (Testowałem i działa) smile.gif

  1. <?php
  2. $node_id = 5; //wybieramy jakiś węzeł
  3. $parents= new numeric_fifo_queue; //nowa kolejka FIFO
  4. $parents->push( $node_id ); //wpisujemy id wezla który chcemy usunąć
  5. while( !$parents->is_empty() )
  6. {
  7. while ($row = mysql_fetch_array("SELECT * FROM tree WHERE parent=".$parents->pop(), MYSQL_ASSOC))
  8. {
  9. $parents->push( $row["id"] );
  10. mysql_query ( "DELETE FROM tree WHERE id = ".$row["id"] );
  11. }
  12. }
  13. //na koniec usuwamy węzeł o id = $node_id;
  14. mysql_query ( "DELETE FROM tree WHERE id = ".$node_id );
  15. ?>

Można to jeszcze udoskonalić tak aby pozbyć się końcówki. Wystarczy w zapytaniu do bazy wstawić jedno 'or'. Nie będzie wtedy trzeba pamiętać o 2 różnych miejscach usuwania wpisu:

  1. zapytanie:
  2. "SELECT * FROM tree WHERE parent=".$parents->pop()
  3. zamieniamy na:
  4. "SELECT * FROM tree WHERE parent=".$parents->pop()." OR id=".$node_id
  5. i już możemy usunąć ostatnie 'DELETE' query;


Ten post edytował Black-Berry 9.02.2008, 12:07:00


--------------------
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 21.08.2025 - 03:54