2010-08-14 25 views
6

Dlaczego ten kod nie działa?PHP: pobierz element tablicy

echo explode("?", $_SERVER["REQUEST_URI"])[0]; 

Podano syntax error, unexpected '['.

dziwne, to działa:

$tmp = explode("?", $_SERVER["REQUEST_URI"]); 
echo $tmp[0]; 

Ale naprawdę chcę uniknąć stworzyć taką zmienną $tmp tutaj.

Jak to naprawić?


Po pomocnych odpowiedzi, niektóre pozostałe pytania: Czy istnieje dobry powód konstrukcji języka, aby ten nie możliwe? A może implementatorzy PHP po prostu o tym nie pomyśleli? A może z jakiegoś powodu było to trudne?

+0

Zobacz http://wiki.php.net/rfc/functionarraydereferencing – GZipp

+0

[Array Dereferencing przyjdzie wkrótce do PHP] (http: // schlueters.de/blog/archiwa/138-Features-in-PHP-trunk-Array-dereferencing.html) – Gordon

Odpowiedz

3

Jest to (głupie) ograniczenie obecnego parsera PHP, którego pierwszy przykład nie działa. Jednak podobno następna poważna wersja PHP naprawi to.

5

W przeciwieństwie do JavaScript, PHP nie może adresować elementu tablicy po funkcji. Musisz podzielić go na dwie instrukcje lub użyć array_slice().

+0

Tak, wydaje się, że tak. :) Ale dlaczego? Czy istnieje jakiś dobry powód, aby projektować język? A może implementatorzy PHP po prostu o tym nie pomyśleli? A może z jakiegoś powodu było to trudne? – Albert

+0

Możesz użyć funkcji current() i next() również dla 0 i 1 elementów. – Anpher

+0

Lub użyj 'listy' po lewej stronie. – strager

2

Take a look at this previous question.

Sugestia Hoohaah użycia strstr() jest całkiem niezła. Poniższa powróci od początku łańcucha do pierwszego ? (trzeci argument za strstr() jest dostępna tylko dla PHP 5.3.0 dalsza):

echo strstr($_SERVER["REQUEST_URI"], "?", TRUE); 

Albo jeśli chcesz trzymać się eksplodować, ty może użyć, jeśli list(). (The 2 wskazuje, że co najwyżej 2 elementy zostaną zwrócone przez eksplozję).

list($url) = explode("?", $_SERVER["REQUEST_URI"], 2); 
echo $url; 

Wreszcie używać natywnie dostępny PHP URL parsing;

$info = parse_url($_SERVER["REQUEST_URI"]); 
echo $info["scheme"] . "://" . $info["host"] . $info["path"]; 
+1

Próbuje go usunąć, a nie odzyskać. – Artefacto

+0

Dzięki za podpowiedź. Chociaż jedyną rzeczą, której chcę, jest uzyskanie wszystkiego przed pierwszym "?", Więc myślę, że "eksplodować" jest po prostu łatwiejsze, prawda? – Albert

+0

@Albert & @Artefacto - Okay, zredagowałem to. –

0

EDIT:

echo current(explode("?", $_SERVER["REQUEST_URI"])); 
+1

array_shift należy przekazać argumentem przez odwołanie. – Artefacto

+0

co z aktualnym()? – NAVEED

+0

To samo. Zobacz [manual] (http://pt.php.net/current). – Artefacto

4

Jest to dozwolone tylko w gałęzi rozwojowej PHP (jest to nowa funkcja o nazwie "array wyłuskania"):

echo explode("?", $_SERVER["REQUEST_URI"])[0]; 

Można to zrobić

list($noQs) = explode("?", $_SERVER["REQUEST_URI"]); 

lub użyj array_slice/temp zmienne, takie jak stillstanding powiedział. Nie powinieneś używać array_shift, ponieważ oczekuje on argumentu przekazanego przez referencję.

+1

-1 Nie chce używać dodatkowej zmiennej (temp) i chce uzyskać do niej bezpośredni dostęp. Jaka jest różnica między $ noQs (w twoim anwser) i $ temp (w jego pytaniu) tutaj. – Awan

0

Wierzę, że PHP 5.4 zawiera tę funkcję w końcu. Niestety, minie trochę czasu, zanim twój przeciętny serwer zaktualizuje swoją wersję PHP. Moje Ubuntu VPS nie ma go nawet w domyślnych repozytoriach.