Dostęp do tablicy zwróconej przez funkcję w php

88

Używam silnika szablonów, który wstawia kod w mojej witrynie tam, gdzie chcę.

Napisałem funkcję do testowania pod kątem czegoś, co jest dość łatwe:

myfunction() { return '($this->data["a"]["b"] ? true : false)'; }

Problem polega na tym, że $ this-> dane są prywatne i nie mam do nich dostępu wszędzie, więc muszę użyć getData (); co powoduje mój problem.

$this->getData()['a']['b']

nie działa, a przypisanie wartości jako pierwszej również nie działa, ponieważ będzie ona używana bezpośrednio w bloku if ().

Jakieś pomysły?

enyo
źródło
Przypisanie wartości zwracanej na pewno działa i jest jedynym sposobem. Czy możesz pokazać nam swój niedziałający kod?
Anti Veeranna,
Cóż, to nie działa, ponieważ kod zostanie wstawiony w if (/ * kod tutaj * /). Więc nie mogę po prostu przypisać danych wcześniej.
enyo
1
Co ty w ogóle budujesz? :) coś z eval?
Anti Veeranna,
Co próbujesz sprawdzić? Czy próbujesz sprawdzić, czy element tablicy istnieje i ma niepustą wartość? Możesz użyć do tego funkcji „pusty”. To pytanie wymaga większej jasności!
txwikinger
W jaki sposób ta wartość ciągu, którą zwracasz, jest (była) myfunction()dalej przetwarzana? W twoim pytaniu brakuje tej części.
hakre

Odpowiedzi:

134

Od PHP 5.4 można to zrobić dokładnie:

getSomeArray()[2]

Źródła: https://secure.php.net/manual/en/language.types.array.php#example-62

W PHP 5.3 lub wcześniejszym musisz użyć zmiennej tymczasowej.

enyo
źródło
4
Mam PHP 5.4.11-1~precise+1i ta funkcja nie działa! Otrzymałem wiadomość w odpowiedziParse error: syntax error, unexpected '['
Eugene
1
+ Eugene, sprawiłeś, że to działa? Może inni mają ten sam problem.
enyo
2
Dopiero php 5.4 zajęło obsługę notacji tablicowej zwracanej przez funkcje ?! Co za paskudny błąd.
Basil Musa,
A potem próbujesz pobrać pierwszy element tablicy wygenerowanej przez array_filter i zaczynasz płakać
Loupax
17

Nie możesz użyć czegoś takiego:

$this->getData()['a']['b']

tj. składnia dostępu do tablicy nie jest możliwa bezpośrednio w wywołaniu funkcji.

Musisz użyć tymczasowej zmiennej , takiej jak ta:

$tmp = $this->getData();
$tmp['a']['b']    // use $tmp, now

W twoim przypadku prawdopodobnie oznacza to użycie czegoś takiego:

function myfunction() {
  $tmp = $this->getData();
  return ($tmp['a']['b'] ? true : false);
}

Musisz :

  • najpierw wywołaj swoją getData()metodę i zapisz jej wartość zwracaną w tymczasowej zmiennej
  • następnie użyj tej tymczasowej zmiennej do testu

Właściwie nie masz wielkiego wyboru ...

Pascal MARTIN
źródło
Cóż, jak powiedziałem, moim problemem jest to, że ten kod jest wstawiany bezpośrednio w if (/ * kod idzie tutaj * /), więc zdefiniowanie funkcji nie jest tak naprawdę możliwe ...
enyo
Czy nie możesz przypisać wyniku wywołania metody do zmiennej przed instrukcją if i użyć tej zmiennej w instrukcji if, zamiast bezpośrednio próbować wywołać metodę z instrukcji if?
Pascal MARTIN
1
Niestety nie ... To jest silnik szablonowy i nie mam nad nim kontroli.
enyo
12

Ok ... najwyraźniej nie ma lepszego sposobu, więc odpowiem sobie niezbyt pięknym rozwiązaniem:

Stworzyłem funkcję:

arrayGet($array, $index) { return $array[$index]; }

I użyłem tego w ten sposób:

myfunction() { return '(arrayGet(arrayGet($this, "a"), "b") ? true : false)' }

To nie jest ładne, ale działa.

enyo
źródło
1

$this->datajest zawsze dostępny, jeśli jest chroniony. nie jest dostępne z każdego miejsca, więc jeśli zwracasz swój kod i jest on oceniany jako taki, powinno być w porządku.$object->data$this

Przy okazji, w twoim kodzie jest błąd: cudzysłowy muszą zostać zmienione.

myfunction() { return '($this->data[\'a\'][\'b\'] ? true : false)'; }
soulmerge
źródło
Tak, przepraszam ... poprawiłem swój post: $ this-> dane są oczywiście prywatne. Poprawiłem także literówkę podczas tworzenia błędu.
enyo
1

Jest to możliwe od wersji PHP 5.4.

Jeśli nie chcesz do tego tymczasowej zmiennej , a twoja wersja PHP jest mniejsza niż 5.4 , nadal możesz użyć kilku wbudowanych funkcji, aby uzyskać pierwszy lub ostatni element:

$x     = 'first?last';
$first = array_shift(explode('?', $x));
$last  = end(explode('?', $x));
$last2 = array_pop(explode('?', $x));

Edycja: !!! Proszę zauważyć, że w późniejszych wersjach (5.4+) PHP wyśle ​​powiadomienie, ponieważ end oczekuje jedynie zmiennych jako parametrów.

Lajos Meszaros
źródło