Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] Problem z zasięgiem zmiennej w funkcji opartej o array_walk
piotr_piotr
post 22.06.2012, 11:33:39
Post #1





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 22.06.2012

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


Witam, moim celem było stworzenie kilku prostych funkcji operujących na wielowymiarowej tablicy, która ma stanowić strukturę treści strony www:

  1. $Menu = array ( //Przykładowa tablica stanowiąca Menu
  2.  
  3. "Strona główna",
  4. "Oferta" => array("Kuchnia" => array("Meble" => array("Stoły","Krzesła"),"Zabudowy"),"Łazienka"),
  5. "Kontakt"
  6. );


Funkcję odpowiedzialną za wyświetlenie zagnieżdzonej listy HTML już zrobiłem, teraz chciałem zrobić funkcję, która dla podanego argumentu (np. "Krzesła") wyświetli rodziców (czyli docelowo wartości: Oferta i Meble). Stworzyłem coś co działa:

  1. $parents_of = "Krzesła";
  2.  
  3. function Wyswietl_Rodzicow ($Menu) {
  4.  
  5. function funkcja_pomocnicza($key,$val,$rodzice=false) {
  6.  
  7. global $parents_of;
  8.  
  9. if(is_array($key)):
  10.  
  11. if($val == $parents_of): echo $rodzice; endif;
  12. $rodzice .= "/".$val;
  13.  
  14. array_walk($key,funkcja_pomocnicza,$rodzice);
  15.  
  16. else:
  17.  
  18. if($key == $parents_of): echo $rodzice; endif;
  19.  
  20. endif;
  21.  
  22. }
  23.  
  24. array_walk($Menu,funkcja_pomocnicza);
  25.  
  26. }


I teraz mój problem: zmienna $parents_of traci zasięg gdy przesunę ją jako drugi argument funkcji Wyswietl_Rodzicow(). Chciałbym po prostu móc wywoływać tę funkcję w sposób Wyswietl_Rodzicow($Menu,$parents_of). Czemu tak się dzieje?
Go to the top of the page
+Quote Post
nospor
post 22.06.2012, 11:37:48
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
zmienna $parents_of traci zasięg gdy przesunę ją jako drugi argument funkcji Wyswietl_Rodzicow().
Przecież Wyswietl_Rodzicow nie ma argumentu w postaci $parents_of ani na pierwszym miejscu ani na drugim, ani na jakimkolwiek


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
piotr_piotr
post 22.06.2012, 11:48:00
Post #3





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 22.06.2012

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


Tak, przedstawiłem działający kod, dlatego zmienna $parents_of jest zadeklarowana w 1. linii. Problem pojawia się, gdy zamiast deklarować ją na sztywno przenoszę ją jako drugi argument funkcji - wtedy funkcja przestaje działać.
Go to the top of the page
+Quote Post
nospor
post 22.06.2012, 11:48:46
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




To pokaż błędny kod. No jak mamy ci go poprawić nie widząć co pozmieniałeś.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
piotr_piotr
post 22.06.2012, 11:51:47
Post #5





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 22.06.2012

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


Kod nie dający żadnych efektów:

  1. function Wyswietl_Rodzicow ($Menu,$parents_of) {
  2.  
  3. function funkcja_pomocnicza($key,$val,$rodzice=false) {
  4.  
  5. if(is_array($key)):
  6.  
  7. if($val == $parents_of): echo $rodzice; endif;
  8. $rodzice .= "/".$val;
  9.  
  10. array_walk($key,funkcja_pomocnicza,$rodzice);
  11.  
  12. else:
  13.  
  14. if($key == $parents_of): echo $rodzice; endif;
  15.  
  16. endif;
  17.  
  18. }
  19.  
  20. array_walk($Menu,funkcja_pomocnicza);
  21.  
  22. }


Ten post edytował piotr_piotr 22.06.2012, 12:26:31
Go to the top of the page
+Quote Post
nospor
post 22.06.2012, 12:01:15
Post #6





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Dobrze:
  1. function t1($zm){
  2. function t2($zm){
  3. echo $zm;
  4. }
  5. t2($zm);
  6. }
  7. t1('aaaa');


Zle:
  1. function t1($zm){
  2. function t2(){
  3. echo $zm;
  4. }
  5. t2();
  6. }
  7. t1('aaaa');


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
piotr_piotr
post 22.06.2012, 12:14:38
Post #7





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 22.06.2012

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


  1. function Wyswietl_Rodzicow ($Menu,$parents_of) {
  2.  
  3. function funkcja_pomocnicza($key,$val,$rodzice=false,$parents_of) {
  4.  
  5. if(is_array($key)):
  6.  
  7. if($val == $parents_of): echo $rodzice; endif;
  8. $rodzice .= "/".$val;
  9.  
  10. array_walk($key,funkcja_pomocnicza,$rodzice);
  11.  
  12. else:
  13.  
  14. if($key == $parents_of): echo $rodzice; endif;
  15.  
  16. endif;
  17.  
  18. }
  19.  
  20. array_walk($Menu,funkcja_pomocnicza);
  21.  
  22. }


Rezultat: Missing argument 4 (...) in line 3. Jeśli wywołam funkcję w ten sposób: Wyswietl_Rodziców($Menu,Krzesła) to w linii 3. zmienna $parents_of powinna mieć wartość "Krzesła", a jest pusta, dlaczego?

Ten post edytował piotr_piotr 22.06.2012, 12:26:20
Go to the top of the page
+Quote Post
nospor
post 22.06.2012, 12:19:44
Post #8





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




array_walk($Menu,funkcja_pomocnicza); - przecież nie przekazujesz do funkcja pomocnicza parametru $parents_of....

analogicznie przy innych wywołaniach

I wywal te global $parents_of;
przeciez zmienna ma isc z parametru funkcji a nie z global


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
piotr_piotr
post 22.06.2012, 12:25:32
Post #9





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 22.06.2012

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


A w jaki sposób powinienem ją przekazać?

  1. array_walk($tablica, funkcja($arg))


To chyba nie jest poprawna składnia?
Go to the top of the page
+Quote Post
nospor
post 22.06.2012, 12:50:29
Post #10





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




http://www.php.net/array_walk
Cytat
userdata

If the optional userdata parameter is supplied, it will be passed as the third parameter to the callback funcname.
Czyli z parametrów $rodzice=false,$parents_of masz zrobic jeden jako tablica smile.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
piotr_piotr
post 22.06.2012, 15:32:00
Post #11





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 22.06.2012

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


Dzięki za wskazówki, udało się. Oto aktualny kod:

  1. function Wyswietl_Rodzicow ($Menu,$parents_of) {
  2.  
  3. $data = array('',$parents_of);
  4.  
  5. function funkcja_pomocnicza($key,$val,$data) {
  6.  
  7. if(is_array($key)):
  8.  
  9. if($val == $data[1]): print_r( $data[0] ); endif;
  10.  
  11. $data[0][] = $val;
  12.  
  13. array_walk($key,funkcja_pomocnicza,$data);
  14.  
  15. else:
  16.  
  17. if($key == $data[1]): print_r( $data[0] ); endif;
  18.  
  19. endif;
  20.  
  21. }
  22.  
  23. array_walk($Menu,funkcja_pomocnicza,$data);
  24.  
  25. }
  26. ##
  27.  
  28. //wywołanie
  29. Wyswietl_Rodzicow($Menu,Krzesła);


Próbowałem jeszcze przerobić ją odrobinę, by funkcja jako rezultat zwracała tablicę:

  1. function Wyswietl_Rodzicow ($Menu,$parents_of) {
  2.  
  3. $data = array('',$parents_of);
  4.  
  5. function funkcja_pomocnicza($key,$val,$data) {
  6.  
  7. if(is_array($key)):
  8.  
  9. if($val == $data[1]): return $data[0]; endif;
  10.  
  11. $data[0][] = $val;
  12.  
  13. array_walk($key,funkcja_pomocnicza,$data);
  14.  
  15. else:
  16.  
  17. if($key == $data[1]): return $data[0]; endif;
  18.  
  19. endif;
  20.  
  21. }
  22.  
  23. array_walk($Menu,funkcja_pomocnicza,$data);
  24.  
  25. }


Ale bez skutku. Gdzie znów popełniam błąd?

Ten post edytował piotr_piotr 22.06.2012, 15:36:51
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 Wersja Lo-Fi Aktualny czas: 17.06.2025 - 19:08