2010-08-14 11 views
6

Perché questo codice non funziona?PHP: get array element

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

Dice syntax error, unexpected '['.

Stranamente, questo funziona:

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

Ma ho davvero vuole evitare di creare un tale variabile $tmp qui.

Come si risolve?


Dopo le risposte utili, alcune domande rimanenti: C'è qualche buona ragione per il design della lingua per rendere questo non possibile? O gli implementatori di PHP non ci hanno pensato? O per qualche motivo è stato difficile renderlo possibile?

+0

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

+0

[La dereferenziazione di array arriverà in un PHP vicino a voi presto] (http: // schlueters.de/blog/archives/138-Funzioni-in-PHP-trunk-Array-dereferencing.html) – Gordon

risposta

3

È una (stupida) limitazione del parser PHP corrente che il primo esempio non funziona. Tuttavia, presumibilmente la prossima versione principale di PHP risolverà questo problema.

5

differenza JavaScript, PHP non può indirizzare un elemento matrice dopo una funzione. Devi dividerlo in due istruzioni o usare array_slice().

+0

Sì, sembra così. :) Ma perché? C'è qualche buona ragione per il design della lingua? O gli implementatori di PHP non ci hanno pensato? O per qualche motivo è stato difficile renderlo possibile? – Albert

+0

È possibile utilizzare le funzioni corrente() e successiva() anche per gli elementi 0 e 1. – Anpher

+0

Oppure usa 'lista' sul lato sinistro. – strager

2

Take a look at this previous question.

suggerimento di Hoohaah di utilizzare strstr() è piuttosto bella. Di seguito tornerà a partire dall'inizio della stringa fino alla prima ? (il terzo argomento per strstr() è disponibile solo per PHP 5.3.0 in poi):

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

O se si vuole attaccare con esplodere, voi può fare uso se list(). (Il 2 indica che al massimo 2 elementi saranno restituiti dall'esplosione).

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

Infine, per utilizzare lo PHP URL parsing nativamente disponibile;

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

Sta cercando di rimuoverlo, non di recuperarlo. – Artefacto

+0

Grazie per il suggerimento. Anche se, l'unica cosa che voglio è ottenere tutto prima del primo '?', Quindi immagino che "esplodere" sia più semplice qui, non è vero? – Albert

+0

@Albert & @Artefacto - Va bene, modificato. –

0

EDIT:

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

array_shift dovrebbe essere passato un argomento per riferimento. – Artefacto

+0

che dire di current()? – NAVEED

+0

Stessa cosa. Vedi il [manuale] (http://pt.php.net/corrente). – Artefacto

4

Ciò è consentito solo nel ramo di sviluppo di PHP (si tratta di una nuova funzionalità denominata "allineamento dereferenziando"):

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

Si può fare questo

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

o utilizzare array_slice/temp variabile, come stillstanding detto. Non dovresti usare array_shift, poiché si aspetta un argomento passato per riferimento.

+1

-1 Non vuole usare variabili extra (temp) e vuole accedervi direttamente. Qual è la differenza tra $ noQ (nel tuo anwser) e $ temp (nella sua domanda) qui. – Awan

0

Credo che PHP 5.4 sia dotato di questa funzione, finalmente. Purtroppo, ci vorrà un po 'prima che il tuo host web medio aggiorni la loro versione di PHP. Il mio Ubuntu VPS non ha nemmeno il repository predefinito.