50 votes

PHP : Accéder aux valeurs d'un tableau à la volée

En php, j'ai souvent besoin de mapper une variable à l'aide d'un tableau ... mais je n'arrive pas à le faire dans un one liner. c.f. 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 me gêne de temps en temps ... Je n'aime pas le fait d'utiliser une variable pour rien ;)

4 votes

Travaux à partir de PHP v5.4 syntaxe illégale dans PHP <= v5.3

40voto

John Douthat Points 28189

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

Voici quelques autres exemples d'indices non valides dans 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.

2 votes

Il y a eu une proposition de modification au moins pour la deuxième syntaxe, mais elle a été rejetée : wiki.php.net/rfc/functionarraydereferencing

11 votes

Le statut est maintenant accepté wiki.php.net/rfc/functionarraydereferencing

3 votes

Cette réponse n'est plus exacte. Depuis la version 5.5, PHP supporte le déréférencement des constantes, des tableaux et des chaînes de caractères. wiki.php.net/rfc/constdereference

23voto

Mbrevda Points 1417

C'est ce qu'on appelle le déréférencement d'un 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 contants/chaînes de caractères ainsi qu'aux tableaux

19voto

onnodb Points 4246

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

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

Vous pouvez aussi écrire une petite fonction :

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

et l'appeler avec :

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

Le tableau devrait être détruit automatiquement maintenant.

0 votes

@onnodb, Strict Standards: Only variables should be passed by reference pour votre fonction indexonce . Pourquoi ajoutez-vous le & référence ?

6voto

Uneebe Points 41

Il se peut que cela ne soit pas directement lié Mais je suis venu sur ce site pour trouver une solution à ce problème spécifique.

J'ai obtenu un 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 suit et je l'ai obtenue.

array_pop( array_pop( the_function_which_returned_the_above_array() ) )

Il a donc été réalisé en une seule ligne :) J'espère que cela sera utile à quelqu'un.

0 votes

Cela ne fonctionne que pour la dernière valeur, et vous devrez supprimer la valeur du fichier tableau original .

2voto

tjma2001 Points 21
function doSomething()
{
    return $somearray;
}

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

0 votes

Comment pouvez-vous faire get(1) sur un tableau ? Erreur fatale : Appel à une fonction membre get() sur un non-objet dans file.php sur la ligne 21

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X