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?


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.


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 ...


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.


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)'; }

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.