PHP: Valor de Array de acceso sobre la marcha


En php, a menudo necesito mapear una variable usando un array ... pero no puedo parecer ser capaz de hacer esto en una sola línea. c.f. ejemplo:

// the following results in an error:
echo array('a','b','c')[$key];

// this works, using an unnecessary variable:
$variable = array('a','b','c');
echo $variable[$key];

Este es un problema menor, pero sigue molestando de vez en cuando ... No me gusta el hecho de que use una variable para nada;)

Author: Michael, 2008-08-16

9 answers

No me molestaría por esa variable extra, realmente. Sin embargo, si lo desea, también puede eliminarlo de la memoria después de haberlo usado:

$variable = array('a','b','c');
echo $variable[$key];
unset($variable);

O bien, podrías escribir una pequeña función:

function indexonce(&$ar, $index) {
  return $ar[$index];
}

Y llama a esto con:

$something = indexonce(array('a', 'b', 'c'), 2);

El array debe ser destruido automáticamente ahora.

 15
Author: onnodb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-16 12:55:29

La respuesta técnica es que el Gramática del lenguaje PHP solo permite la notación de subíndices al final de expresiones variablesy no expresiones en general, que es como funciona en la mayoría de los otros lenguajes. Siempre lo he visto como una deficiencia en el lenguaje, porque es posible tener una gramática que resuelve subíndices contra cualquier expresión sin ambigüedades. Podría ser el caso, sin embargo, que están utilizando un generador de analizador inflexible o simplemente no quieren romper algún tipo de compatibilidad hacia atrás.

Aquí hay un par de ejemplos más de subíndices no válidos en expresiones válidas:

$x = array(1,2,3);
print ($x)[1]; //illegal, on a parenthetical expression, not a variable exp.

function ret($foo) { return $foo; }
echo ret($x)[1]; // illegal, on a call expression, not a variable exp.
 38
Author: John Douthat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-21 17:32:41

Esto se llama desreferenciación de matrices. Se ha añadido en php 5.4. http://www.php.net/releases/NEWS_5_4_0_alpha1.txt

actualización [2012-11-25]: a partir de PHP 5.5, la desreferenciación se ha agregado a contants / strings, así como a arrays

 23
Author: Mbrevda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-25 11:03:56

Esto podría no estar directamente relacionado.. Pero llegué a este post encontrando solución a este problema específico.

Obtuve un resultado de una función en la siguiente forma.

Array
(
    [School] => Array
            (
                [parent_id] => 9ce8e78a-f4cc-ff64-8de0-4d9c1819a56a
            )
)

Lo que quería era el valor parent_id "9ce8e78a-f4cc-ff64-8de0-4d9c1819a56a". Usé la función así y la obtuve.

array_pop( array_pop( the_function_which_returned_the_above_array() ) )

Entonces, se hizo en una línea :) Espero que sea útil para alguien.

 5
Author: Uneebe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-23 07:36:14
function doSomething()
{
    return $somearray;
}

echo doSomething()->get(1)->getOtherPropertyIfThisIsAnObject();
 2
Author: tjma2001,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-18 08:57:05

En realidad, hay una solución elegante:) Lo siguiente asignará el 3er elemento de la matriz devuelta por myfunc a my myvar:

$myvar = array_shift(array_splice(myfunc(),2));
 1
Author: John Smith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-26 11:50:04

O algo como esto, si necesita el valor de la matriz en una variable

$variable = array('a','b','c');
$variable = $variable[$key];
 0
Author: blasteralfred Ψ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-18 08:55:52

Hay varios oneliners que podrías encontrar, usando funciones php array_*. Pero te aseguro que hacerlo es totalmente redundante comparando lo que quieres lograr.

Ejemplo puedes usar algo como seguir, pero no es una solución elegante y no estoy seguro sobre el rendimiento de esto;

   array_pop ( array_filter( array_returning_func(), function($key){    return $key=="array_index_you_want"? TRUE:FALSE;    },ARRAY_FILTER_USE_KEY ) );

Si está utilizando un framework php y está atascado con una versión anterior de php, la mayoría de los frameworks tiene bibliotecas de ayuda.

Ejemplo: Ayudantes de arreglo de Codeigniter

 0
Author: shan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-24 11:55:27

Aunque el hecho de que la desreferenciación se haya agregado en PHP >=5.4, podría haberlo hecho en una línea usando el operador ternario:

echo $var=($var=array(0,1,2,3))?$var[3]:false;

De esta manera no se mantiene el array solo la variable. y no necesitas funciones adicionales para hacerlo...Si esta línea se usa en una función, se destruirá automáticamente al final, pero también puede destruirla usted mismo como se dijo con unset más adelante en el código si no se usa en una función.

 0
Author: Elementary,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-10 06:21:39