Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Bezpośredni dostęp do tablicy zwracanej przez funkcję
Forum PHP.pl > Forum > PHP
slawo123
Witam. Dziś zastanawiałem się czy jest w php jakiś sposób by pobrać wartość z tablicy zwracanej przez funkcję.

Przykład:

  1. function foo($param)
  2. {
  3. return array('k1' => 'v1' , 'k2' => 'v2');
  4. }
  5.  
  6.  
  7. // to nie zadziała
  8. $str = 'prefix ' . foo($param)['k2'] .' postfix';
  9.  
  10.  
  11. // tak nie chcę bo to nowa linijka w kodzie i nowa zmienna
  12. $result = foo($param);
  13. $str = 'prefix ' . $result['k2'] .' postfix';
  14.  
  15.  
  16. // można tak, ale czy nie ma w php gotowej funkcji do tego lub innej sprytnej metody
  17. function arrayGet($array, $index) { return $array[$index]; }
  18. $str = 'prefix ' . arrayGet(foo($param), 'k2') .' postfix';


Ostatnia metoda mnie prawie zadowala więc temat zakładam z ciekawości.
wookieb
Nie ma innej opcji
nospor
Cytat
// można tak, ale czy nie ma w php gotowej funkcji do tego lub innej sprytnej metody
function arrayGet($array, $index) { return $array[$index]; }
$str = 'prefix ' . arrayGet(foo($param), 'k2) .' postfix';
A powiedz mi proszę, co robisz, gdy chcesz pobrać nie tylko k2 ale też k1?
slawo123
Zawsze będę pobierał tylko 1 wartość z tablicy w tym miejscu kodu. Wiem do czego pijesz, że niby "nieoptymalne" przy większej liczbie wywołań - zgoda ale nie przewiduję więcej niż 1 wywołanie.
wookieb
Zawsze możesz zrobić coś takiego
  1. funtion test() {
  2. $obj = new stdClass;
  3. $obj->k1 = 5;
  4. $obj->k2 = 10;
  5. return $obj;
  6. }
  7.  
  8. echo test()->k1;

Bodajże konwersja tablicy do obiektu też przejdzie
  1. function test() {
  2. return (object)array('k1' => 'test', 'k2' => 'ziom');
  3. }
  4. echo test()->k1;
slawo123
Też myślałem o obiekcie ale jednak funkcja musi zwracać zwykłą tablicę więc to rozwiązanie odpada - ale plus dla Ciebie wookieb za zainteresowanie.
Wygląda na to że faktycznie nie ma takiej opcji w php, może to i dobrze bo by teraz było więcej brzydkich skryptów wink.gif
Jeszcze możnaby dać do funkcji opcjonalny parametr z nazwą klucza i wtedy zwracałaby tylko 1 element zamiast całej tablicy.

Pozdrawiam!
maly_swd
  1. function foo($param, $var=false)
  2. {
  3. $array_foo=array('k1' => 'v1' , 'k2' => 'v2');
  4. if($var) return $array_foo['var'];
  5. return $array_foo;
  6. }
  7.  
  8.  
  9. $str = 'prefix ' . foo($param, 'k2') .' postfix';
  10.  


uirapuru
jesli się nie mylę, to głownym argumentem przeciwko konstrukcji powyższej był problem, co zrobić, gdy użytkownik napisze:

foo($bar)['key'] = 'value';

Jak powinien zachować się interpreter? Przypisać coś zwróconej tablicy? ale gdzie ta tablica wtedy zostaje przypisana? Ciężka sprawa.

Natomiast czytalem, że z obostrzeniami dot. powyższego przypadku zwracanie w ten sposob wartosci z tablic będzie -chyba- dostępne w nowych wersjach PHP.
Crozin
@uirapuru: Raczej się mylisz, bo taka konstrukcja nie wprowadza żadnych specjalnych problemów (chociaż należałoby jej unikać jako "zbyt pokręconej"). Ot, modyfikujesz zwróconą tablicę. A to czy masz do niej jakąś referencję czy nie, to już inna, kompletnie nieistotna sprawa. Jest to konstrukcja analogiczna do:
  1. foo()->bar = 'value'; // zwracany jest obiekt stdClass czy jakiś inny


Brak obsługi takiej konstrukcji jak i kilku innych to po prostu wina deweloperów PHP.
uirapuru
Zgadzam się, że to brakująca 'opcja', mi tez jej wielokrotnie brakowało. Chodzi mi raczej o konsekwencję w działaniu, skoro

$aArray['key'] = 'value';

modyfikuje źródłową tablicę, to

foo($bar)['key'] = 'value';

wprowadza moim zdaniem zamieszanie. Ale to moja opinia, nie będzie stanowić dla mnie to problemu i szczerze powiedziawszy z lubością przyjmę taką możliwość smile.gif
krowal
Możesz jeszcze tak:
  1. array_merge($foo($bar), array('key' => 'value'));

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.