Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php]Rekurencja - zapis do zmiennej
Forum PHP.pl > Forum > PHP
styryl
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
lDoran
Da się pokaż jak robisz na zwykłej tablicy.
styryl
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ą.
Methestel
  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
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.