Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Rekurencja uzytkownicy
Forum PHP.pl > Forum > PHP
graffiti333
Witam


Wykombinowałem taką funkcje podającą id uzytkownikow podleglych pod parrent_id


  1. function getSubUsersId($id){
  2.  
  3. $q = mysql_query("select u.id from users u where u.id_parrent_user = ".$id."" );
  4.  
  5. while ($uQ = mysql_fetch_array($q, MYSQL_ASSOC)){
  6.  
  7. echo $uQ['id'].",";
  8.  
  9. getSubUsersId($uQ['id']);
  10.  
  11. }
  12.  
  13. }
  14.  
  15. $id = 9;
  16. getSubUsersId($id);


funkcja podaje mi prawidłowo 8,9,11,13,14,12,10,17,

jak mam zapisać to do tablicy ?

Pozdrawiam


Fifi209
np. static albo global ;]
thek
A może zamiast kombinować z kilkunastoma zwrotkami i potem jechać while dałbyś w zapytaniu where jakieś id group by to id i w select group_concat? Dostałbyś także wszystkie id odzielone przecinkami i potem już można się bawić, przykładowo konwertując string do tablicy funkcją explode. Zresztą w Twojej wersji też explode można użyć.
graffiti333
explode nie wyjdzie bo funkcja nie zwraca tylko wyrzuca na ekran po koleji 2,2,3,4,5,67,
thek
Skoro Ci zależy tylko i wyłącznie na znalezieniu userów podległych jedynie konkretnemu innemu o nie prościej użyć:
  1. function zalezni( $id ) {
  2. if( !ctype_digit( $id ) )
  3. return FALSE;
  4. $sql = 'SELECT GROUP_CONCAT( u.id ) AS userzy FROM users AS u WHERE u.id_parent_id = '.$id.' GROUP BY u.parent_id';
  5. $resource = mysql_query($sql);
  6. if( $resource AND mysql_num_rows($resource) > 0 )
  7. return explode( ',', mysql_result( $resource, 0, 0 ) );
  8. else
  9. return FALSE;
  10. }
Inaczej to nieco wygląda jeśli chcesz jeszcze rekurencyjnie sprawdzać, czy pod jakiegoś do tego podległego nie ma podległego kolejnego. Wtedy bowiem bliższe jest Twojemu rozwiązaniu jeśli zachowamy strukturę bazy bez zmian. Zmiany nastąpią w nieco innym podejściu do danych. Zamiast echo pojawi się zapis do tablicy, sama tablica pojawi jako parametr funkcji także.
  1. function getSubUsersId($id, &$table){
  2. $q = mysql_query('SELECT id FROM users WHERE id_parrent_user = '.$id );
  3. while ($uQ = mysql_fetch_assoc($q)){
  4. $table[] = $uQ['id'];
  5. getSubUsersId($uQ['id'], $table);
  6. }
  7. }
  8. $id = 9;
  9. $wynik = array();
  10. getSubUsersId($id, $wynik);

Od razu mówię, że nie jest to optymalne co robisz i moim zdaniem niepoprawne, bo tworzysz do bazy wiele zapytań zbędnych, które nic nie zwrócą. Do tego kompletnie gubisz zależności. Nie wiesz co jest bezpośrednim podwładnym a co podwładnym podwładnego podwładnego winksmiley.jpg Uwierz, że da się to zrobić lepiej na wiele sposobów, w tym przynajmniej jeden taki, że poślesz jedno zapytanie do bazy, a resztę obrobisz już po stronie PHP. Będziesz tylko sobie "gałązkami manipulował". Lepsze jednak dla wszelkich rekurencyjnych zależności są zmiany w bazie. Poczytaj o drzewkach ip choćby. Optymalizować trzeba pod konkretne zastosowanie i nie ma jednej dobrej metody na wszystkie możliwe warianty.
DiH
Męczyłem się z dobre dwa dni z funkcją rekurencyjną i nie wiedziałem, czemu nie działa, aż znalazłem ten temat. Dzięki thek!
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.