2010-08-14 14 views
6

Warum funktioniert dieser Code nicht?PHP: Array-Element erhalten

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

Es sagt syntax error, unexpected '['.

Merkwürdig ist, dass dies funktioniert:

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

Aber ich möchte wirklich zu vermeiden, eine solche hier $tmp Variable zu erstellen.

Wie behebe ich es?


Nachdem die hilfreichen Antworten, einige noch offenen Fragen: Gibt es einen guten Grund für die Gestaltung der Sprache dieses nicht möglich zu machen? Oder haben die PHP-Implementierer einfach nicht darüber nachgedacht? Oder war es aus irgendeinem Grund schwierig, dies zu ermöglichen?

+0

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

+0

[Array Dereferenzierung wird in naher Zukunft zu einem PHP kommen] (http: // schlueters.de/blog/archives/138-Features-in-PHP-trunk-Array-dereferencing.html) – Gordon

Antwort

3

Es ist eine (dumme) Begrenzung des aktuellen PHP-Parser, der Ihr erstes Beispiel funktioniert nicht. Vermutlich wird dies jedoch durch die nächste Hauptversion von PHP behoben.

5

Im Gegensatz zu Javascript kann PHP ein Array-Element nach einer Funktion nicht adressieren. Sie müssen es in zwei Anweisungen aufteilen oder array_slice() verwenden.

+0

Ja, das scheint so. :) Aber warum? Gibt es einen guten Grund für das Design der Sprache? Oder haben die PHP-Implementierer einfach nicht darüber nachgedacht? Oder war es aus irgendeinem Grund schwierig, dies zu ermöglichen? – Albert

+0

Sie können current() und next() auch für 0 und 1 Elemente verwenden. – Anpher

+0

Oder verwenden Sie 'liste' auf der linken Seite. – strager

2

Take a look at this previous question.

Hoohaahs Vorschlag, strstr() zu verwenden, ist ziemlich nett. Im Folgenden wird von Anfang an der Schnur bis zum ersten ? zurückkehren (das dritte Argument für strstr() ist nur für PHP 5.3.0 Weiter verfügbar):

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

Oder wenn Sie mit explodieren halten möchten, können Sie kann verwenden, wenn list(). (Die 2 zeigt an, dass höchstens 2 Elemente durch Explosion zurückgegeben werden).

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

Schließlich zu verwenden, um die nativ verfügbar PHP URL parsing;

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

Er versucht, es zu entfernen, nicht wiederherstellen. – Artefacto

+0

Danke für den Hinweis. Obwohl das einzige, was ich will, ist, einfach alles vor dem ersten '' 'zu bekommen, also denke ich, dass 'explodieren' hier einfach einfacher ist, oder? – Albert

+0

@ Albert & @Artefacto - Okay, bearbeitet es. –

0

EDIT:

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

array_shift sollte ein Argument als Referenz übergeben werden. – Artefacto

+0

Was ist mit Strom()? – NAVEED

+0

Das Gleiche. Siehe das [Handbuch] (http://pt.php.net/current). – Artefacto

4

Diese nur in dem Entwicklungszweig von PHP erlaubt ist (es ist ein neues Feature namens "Array dereferencing"):

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

Sie können diese

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

oder verwenden Sie array_slice/temp Variable, wie stillstanding sagte. Sie sollten array_shift nicht verwenden, da erwartet wird, dass ein Argument als Referenz übergeben wird.

+1

-1 Er möchte keine zusätzliche Variable (temp) verwenden und möchte direkt darauf zugreifen. Was ist der Unterschied zwischen $ noQs (in deiner anwser) und $ temp (in seiner Frage) hier. – Awan

0

Ich glaube, dass PHP 5.4 mit dieser Funktion endlich kommt. Leider wird es eine Weile dauern, bis Ihr durchschnittlicher Webhost seine PHP-Version aktualisiert. Mein Ubuntu VPS hat es nicht einmal in den Standard-Repos.