Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: zasięg zmiennych w funkcjach zagnieżdżonych (proste drzewko kategorii)
Forum PHP.pl > Forum > PHP
zephyr7
Napisałem bardzo prostą funkcję tworzącą drzewko kategorii.
Niestety, korzysta ona z 2 zmiennych globalnych (poniżej) $n i tablicy wyników.

Czy da się te zmienne jakoś wsadzić w zagnieżdżoną funkcję, żeby uniknąć korzystania z globali?


  1. //gets and sorts by nesting
  2. function get_categories($table, $id,$level,$user_id){
  3. [b]global $n,$results_array;[/b]
  4.  
  5. $query=$this->db->query("SELECT * FROM ".$table." WHERE user_id=".$user_id." and parent_id=".$id);
  6.  
  7. foreach ($query->result_array() as $row)
  8. {
  9. $n++;
  10. //$results_array[$n][$level]=$row["name"];
  11. $results_array[$table][$n]["name"]=$row["name"];
  12. $results_array[$table][$n]["id"]=$row["id"];
  13. $results_array[$table][$n]["parent"]=$row["parent_id"];
  14. $results_array[$table][$n]["level"]=$level;
  15.  
  16. echo $row['name'];
  17. $this->get_categories($table,$row["id"],$level+1,$user_id);
  18. }
  19. return $results_array;
  20.  
  21.  
  22. }
wookieb
Proszę wstawić bbcode.
mat-bi
Przekaż jako argumenty funkcji?
zephyr7
no właśnie chciałem, ale nie widzi!

bo kiedy dodam w definicji funkcji $n=NULL, $result_array=NULL

i dwa dodatkowe argumenty w wywoływanej funkcji $this->....,

wartości argumentów się tracą, z jakiegoś powodu smile.gif

albo może zapytam inaczej: czy użycie tych dwóch globali jest obicachowe/niebezpieczne, czy w ogóle jest sens się z tym bawić i zmieniaćquestionmark.gif?
lobopol
W tym wypadku jest obciachowe.
zephyr7
Kiedy próbuję przekazać zmienną N jako parametr, dzieją się większe cuda:

n:1
n:2
n:2
n:3
n:4
n:3
n:4

Czemu nie idzie po kolei, 1,2,3,4 questionmark.gif?
Helid
  1. public function categories($parent = 0, $categories = array(), $depth = 0)
  2. {
  3. global $categories;
  4. ++$depth;
  5. foreach(DB::select('*')->from('categories')->where('parent', '=', $parent)->execute() as $item)
  6. {
  7. $name = '';
  8. for($x = 2; $x <= $depth; $x++)
  9. {
  10. $name .= '----';
  11. }
  12. $name .= ' '.$item['name'];
  13. $categories[] = array($item['id'] => $name);
  14. $this->categories($item['id'], $categories, $depth);
  15. }
  16. return $categories;
  17. }

Osobiście robię to w ten sposób. Wydaje mi się że przynajmniej jedna zmienna musi być globalna.
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.