Question

En php, j'ai souvent besoin de mapper une variable à l'aide d'un tableau...mais je n'arrive pas à faire cela en une seule ligne.cf.exemple:

// 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];

C'est un problème mineur, mais il continue de bugger de temps en temps...Je n'aime pas le fait d'utiliser une variable pour rien ;)

Était-ce utile?

La solution

Je ne me soucierais pas vraiment de cette variable supplémentaire.Si vous le souhaitez, vous pouvez également le supprimer de la mémoire après l'avoir utilisé :

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

Ou bien, vous pouvez écrire une petite fonction :

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

et appelez ceci avec :

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

Le tableau devrait maintenant être détruit automatiquement.

Autres conseils

La réponse technique est que le Grammaire du langage PHP autorise uniquement la notation en indice à la fin de expressions variables et pas expressions en général, c'est ainsi que cela fonctionne dans la plupart des autres langues.Je l'ai toujours considéré comme une lacune du langage, car il est possible d'avoir une grammaire qui résout sans ambiguïté les indices de n'importe quelle expression.Il se peut cependant qu'ils utilisent un générateur d'analyseur inflexible ou qu'ils ne veuillent tout simplement pas rompre une sorte de compatibilité ascendante.

Voici quelques exemples supplémentaires d'indices non valides sur des expressions valides :

$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.

C'est ce qu'on appelle le déréférencement de tableau.Il a été ajouté dans php 5.4.http://www.php.net/releases/NEWS_5_4_0_alpha1.txt

mise à jour[2012-11-25] : depuis PHP 5.5, le déréférencement a été ajouté aux constantes/chaînes ainsi qu'aux tableaux

Cela n'est peut-être pas directement lié.Mais je suis venu à ce post pour trouver une solution à ce problème spécifique.

J'ai obtenu le résultat d'une fonction sous la forme suivante.

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

ce que je voulais, c'était la valeur parent_id "9ce8e78a-f4cc-ff64-8de0-4d9c1819a56a".J'ai utilisé la fonction comme celle-ci et je l'ai obtenue.

array_pop( array_pop( the_function_which_returned_the_above_array() ) )

Donc, cela a été fait en une seule ligne :) J'espère que ce serait utile à quelqu'un.

function doSomething()
{
    return $somearray;
}

echo doSomething()->get(1)->getOtherPropertyIfThisIsAnObject();

en fait, il existe une solution élégante :) Ce qui suit attribuera le 3ème élément du tableau renvoyé par myfunc à $myvar :

$myvar = array_shift(array_splice(myfunc(),2));

Ou quelque chose comme ça, si vous avez besoin de la valeur du tableau dans une variable

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

Il y a plusieurs oneliners vous pourriez trouver, en utilisant php tableau_* les fonctions.Mais je vous assure que ce faisant, il est totalement redondant de comparer ce que vous voulez réaliser.

Exemple, vous pouvez utiliser quelque chose comme suivant, mais ce n'est pas une solution élégante et je ne suis pas sûr de ses performances ;

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

si vous utilisez un framework php et que vous êtes coincé avec une ancienne version de php, la plupart des frameworks disposent de bibliothèques d'aide.

exemple:Assistants de tableau Codeigniter

bien que le déréférencement ait été ajouté dans PHP >=5.4, vous auriez pu le faire sur une seule ligne en utilisant l'opérateur ternaire :

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

de cette façon, vous ne conservez pas le tableau uniquement la variable.et vous n'avez pas besoin de fonctions supplémentaires pour le faire... Si cette ligne est utilisée dans une fonction, elle sera automatiquement détruite à la fin mais vous pouvez également la détruire vous-même comme indiqué avec unset plus tard dans le code s'il n'est pas utilisé dans une fonction.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top