Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: nested functions, zasięg zmiennych
Forum PHP.pl > Forum > PHP
metoda
Witam. Mam taki problem. Posiadam funkcję do sortowania array'a. Funkcja ta jest metodą pewnej klasy.
  1. public function sortBy($category,$bywhat,$ascdesc){
  2.  
  3. //var_dump($bywhat);
  4.  
  5. function cmp($a, $b)
  6. {
  7. //global $bywhat;
  8. //var_dump($bywhat);
  9. $a=new SimpleXMLElement($a);
  10. $b=new SimpleXMLElement($b);
  11. return strcasecmp($a->advertinfo["$bywhat"],$b->advertinfo["$bywhat"]);
  12. }
  13. if ($category=="all"){
  14. foreach ($this->cats as $cat=>$val){
  15. usort($this->cats["$cat"], "cmp");
  16. }
  17. }
  18. else{
  19. usort($this->cats["$category"], "cmp");
  20. }
  21. }


Problem polega na tym, że do sortowania używam własnej funkcji porównania dwóch elementów array'a. Do fukcji głownej przekazuję parametr -> zmienną $bywhat. Niestety funkcja wewnętrzna funkcja cmp() nie widzi tej zmiennej. Nic nie da zadeklarowanie zmiennej $bywhat w funkcji cmp() jako global, gdyż global nie tycze się poziomu wyżej, tylko poziomu najwyższego zasięgu zmiennych. Nie mogę przekaza także do funkcji cmp() kolejnego parametru $bywhat, bo usort chyba posiada predefinicję funkcji porównywującej z dwoma parametrami. Jak to obejść questionmark.gif Wiem, że mógłbym zrobić osobne funkcje sortowania dla każdej zmeinnej $bywhat, ale to chyba nie na tym polega programowanie smile.gif pozdrawiam i dzięki za odpowiedz.
Kocurro
Witaj,

proponuję zrobić tak:

  1.  
  2. class Cos {
  3.  
  4. private $_tmpByWhat;
  5.  
  6. function cmp($a, $b)
  7. {
  8. var_dump($this->_tmpByWhat );
  9. $a=new SimpleXMLElement($a);
  10. $b=new SimpleXMLElement($b);
  11. return strcasecmp($a->advertinfo["$bywhat"],$b->advertinfo["$bywhat"]);
  12. }
  13.  
  14. public function sortBy($category,$bywhat,$ascdesc){
  15.  
  16. //var_dump($bywhat);
  17.  
  18.  
  19. $this->_tmpByWhat = $bywhat;
  20.  
  21. if ($category=="all"){
  22. foreach ($this->cats as $cat=>$val){
  23. usort($this->cats["$cat"], array( $this, "cmp") );
  24. }
  25. }
  26. else{
  27. usort($this->cats["$category"], array( $this, "cmp" ) );
  28. }
  29. }
  30.  
  31. }


Prawda, że proste ? smile.gif

Myślę, że to może być dobrze zrobione - nie mam jak sprawdzić, napisałem na szybko więc z góry przepraszam za błędy.

Pozdrawiam serdecznie,
Łukasz
metoda
Próbowałem tak smile.gif

Warning: usort() expects parameter 2 to be a valid callback, class 'Search' does not have a method 'cmp'
Kocurro
Zedytowałem tamten post - przepraszam pomyliłem się smile.gif

Teraz powinno być już ok, po prostu funkcję cmp trzeba wynieść do klasy.

Pozdrawiam serdecznie,
Łukasz
metoda
Heh nie pomyślałem aby wyrzucić tą funkcję do klasy smile.gif Musiałem jeszcze tylko zmienić w funkcji cmp aby brał zmienną z klasy czyli:
  1. function cmp($a, $b)
  2. {
  3. $a=new SimpleXMLElement($a);
  4. $b=new SimpleXMLElement($b);
  5. return strcasecmp($a->advertinfo["$this->_tmpByWhat"],$b->advertinfo["$this->_tmpByWhat"]);
  6. }


Dzieki, pomogłeś smile.gif
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.