Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [php]Rekurencja - zapis do zmiennej
styryl
post
Post #1





Grupa: Zarejestrowani
Postów: 223
Pomógł: 27
Dołączył: 16.04.2008
Skąd: Bakutilu

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


Witam prezesów,

Dzisiaj przybiegam z kolejnym problemem a łoto on:

  1. function katid($id)
  2. {
  3.  
  4. $q = "SELECT * FROM kat WHERE id_parent = '$id'";
  5. $res = mysql_query($q);
  6.  
  7. while($r = mysql_fetch_array($res))
  8. {
  9.  
  10. $id = $r['id'];
  11.  
  12. $_SESSION[id_tab] .= ' OR kat = '.$id.'';
  13.  
  14. if(isset($r['id'])){
  15.  
  16. katid($id);
  17.  
  18. }
  19. }
  20.  
  21. return $_SESSION[id_tab];
  22.  
  23. }


Czy da się a jeśli tak to jak biggrin.gif zapisać to zamiast do $_SESSION[id_tab] do zwykłej tablicy id_tab[] i zwrócić przez return? Jakoś mam z tym spory problem a rozwiązanie przez sesje mnie nie zadowala.

Pzdr

styryl
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 3)
lDoran
post
Post #2





Grupa: Zarejestrowani
Postów: 172
Pomógł: 13
Dołączył: 15.11.2009

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


Da się pokaż jak robisz na zwykłej tablicy.
Go to the top of the page
+Quote Post
styryl
post
Post #3





Grupa: Zarejestrowani
Postów: 223
Pomógł: 27
Dołączył: 16.04.2008
Skąd: Bakutilu

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


Najpierw próbowałem na zwykłej zmiennej o tak:

  1. function katid($id)
  2. {
  3.  
  4. $q = "SELECT * FROM kat WHERE id_parent = '$id'";
  5. $res = mysql_query($q);
  6.  
  7. while($r = mysql_fetch_array($res))
  8. {
  9.  
  10. $id = $r['id'];
  11.  
  12. $id_tab .= ' OR kat = '.$id.'';
  13.  
  14. if(isset($r['id'])){
  15.  
  16. katid($id);
  17.  
  18. }
  19. }
  20.  
  21. return $id_tab;
  22.  
  23. }
  24.  


ale zwracało mi tylko jeden rekord, na tablicy robiłem tak:


  1. function katid($id)
  2. {
  3.  
  4. $q = "SELECT * FROM kat WHERE id_parent = '$id'";
  5. $res = mysql_query($q);
  6.  
  7. while($r = mysql_fetch_array($res))
  8. {
  9.  
  10. $id = $r['id'];
  11.  
  12. $id_tab[] = ' OR kat = '.$id.'';
  13.  
  14. if(isset($r['id'])){
  15.  
  16. katid($id);
  17.  
  18. }
  19. }
  20.  
  21. return $id_tab;
  22.  
  23. }
  24.  


efekt był niezadowalający, za bardzo nie mam pomysłu jak to rozegrać, są to moje pierwsze walki z rekurencją.
Go to the top of the page
+Quote Post
Methestel
post
Post #4





Grupa: Zarejestrowani
Postów: 46
Pomógł: 10
Dołączył: 30.06.2008

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


  1. /**
  2.  * Funkcja która zwraca ridzica kategorii. Jeśli kategoria nie ma rodzica lub kategoria o podanym id nie istnieje zwracane jest 0
  3.  * @param int $id
  4.  * @return int
  5.  */
  6. function getParentId($id) {
  7. // $q = "SELECT * FROM kat WHERE id_parent = '$id'";
  8. // $res = mysql_query($q);
  9. // if ($r = mysql_fetch_array($res)) {
  10. // return (int)$r['id'];
  11. // }
  12. // return 0;
  13.  
  14. switch($id) {
  15. case '5': return 4;
  16. case '4': return 3;
  17. case '3': return 2;
  18. case '2': return 1;
  19. case '1': return 0;
  20. default: return 0;
  21. }
  22. }
  23.  
  24. /**
  25.  * Funkcja zwraca id-ki przodków wybranej kategorii w kolejności od najmłodszego do najstarszego przodka
  26.  * @param int $id
  27.  * @param array $ancastorsIds
  28.  * @return array
  29.  */
  30. function getAncastorsIds($id, &$ancastorsIds = array()) { //Drugi parametr jest tylko na potrzeby rekurencji.
  31. $parentId = getParentId($id);
  32. if ($parentId) {
  33. getAncastorsIds($ancastorsIds[] = $parentId, $ancastorsIds);
  34. }
  35. return $ancastorsIds;
  36. }
  37.  
  38. echo ' kat IN ('.implode(',', getAncastorsIds(5)).') '; //Wynik: kat IN (4,3,2,1)


Rozbiłem wszystko na dwie metody. W metodzie getParentId zakomentowałem kod który prawdopodobnie będzie działał u Ciebie. Switch w tej metodzie symuluje wyciąganie danych z bazy danych.

Takie rozwiązanie działa ale jest od razu radzę zainteresować się tym modelem. Przy zastosowaniu tego modelu twój problem sprowadzał by się do wykonania jednego i tylko jednego zapytania do bazy danych niezależnie od położenie kategorii w strukturze.

... a do komunikacją z bazą danych polecam PDO

Ten post edytował Methestel 5.11.2010, 14:10:56
Go to the top of the page
+Quote Post

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: 20.08.2025 - 06:34