2010-08-14 12 views
6

¿Por qué este código no funciona?PHP: obtener el elemento de matriz

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

Dice syntax error, unexpected '['.

Curiosamente, esto funciona:

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

Pero lo que realmente quieren evitar crear una variable tales $tmp aquí.

¿Cómo puedo solucionarlo?


Después de las respuestas útiles, algunas preguntas restantes: ¿Hay alguna buena razón para el diseño del idioma para que esto no sea posible? ¿O los implementadores de PHP simplemente no pensaron en esto? ¿O fue por alguna razón difícil hacer esto posible?

+0

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

+0

[Array Dereferencing llegará pronto a un PHP cerca de usted] (http: // schlueters.de/blog/archives/138-Features-in-PHP-trunk-Array-dereferencing.html) – Gordon

Respuesta

3

Es una limitación (tonta) del analizador de PHP actual que su primer ejemplo no funciona. Sin embargo, supuestamente, la próxima versión principal de PHP solucionará esto.

5

A diferencia de Javascript, PHP no puede direccionar un elemento de matriz después de una función. Tienes que dividirlo en dos declaraciones o usar array_slice().

+0

Sí, eso parece. :) ¿Pero por qué? ¿Hay alguna buena razón para el diseño del idioma? ¿O los implementadores de PHP simplemente no pensaron en esto? ¿O fue por alguna razón difícil hacer esto posible? – Albert

+0

Puede usar las funciones actual() y siguiente() para 0 y 1 elementos también. – Anpher

+0

O use 'list' en el lado izquierdo. – strager

2

Take a look at this previous question.

La sugerencia de Hoohaah de usar strstr() es bastante agradable. A continuación se volverá desde el principio de la cadena hasta el primer ? (el tercer argumento para strstr() sólo está disponible para PHP 5.3.0 en adelante):

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

O si desea seguir con estallar, se puede hacer uso si list(). (El 2 indica que como máximo 2 elementos serán devueltos por explosión).

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

Por último, utilizar la forma nativa disponible PHP URL parsing;

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

Está intentando eliminarlo, no recuperarlo. – Artefacto

+0

Gracias por la pista. Aunque, lo único que quiero es obtener todo antes del primer '?', Así que supongo que 'explotar' es más fácil aquí, ¿no es así? – Albert

+0

@Albert & @Artefacto - De acuerdo, editado. –

0

EDIT:

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

array_shift debe pasar un argumento por referencia. – Artefacto

+0

¿qué hay de actual()? – NAVEED

+0

Lo mismo. Ver el [manual] (http://pt.php.net/current). – Artefacto

4

Esto sólo está permitido en la rama de desarrollo de PHP (que es una nueva característica llamada "matriz de eliminación de referencias"):

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

Usted puede hacer esto

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

o use array_slice/temp variable, como stillstanding dijo. No debe usar array_shift, ya que espera que un argumento pase por referencia.

+1

-1 No quiere usar una variable adicional (temperatura) y quiere acceder a ella directamente. ¿Cuál es la diferencia entre $ noQs (en su carta) y $ temp (en su pregunta) aquí? – Awan

0

Creo que PHP 5.4 viene con esta característica, por fin. Lamentablemente, pasará un tiempo antes de que su host web promedio actualice su versión de PHP. Mi Ubuntu VPS ni siquiera lo tiene en los repos predeterminados.

Cuestiones relacionadas