2008-08-16 26 views
47

En php, j'ai souvent besoin de mapper une variable en utilisant un tableau ... mais je n'arrive pas à le faire dans un seul fichier. c.f. exemple:PHP: Accéder à la valeur du tableau à la volée

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

Ceci est un problème mineur, mais il garde tout casser les pieds de temps en temps ... Je n'aime pas le fait que j'utiliser une variable pour rien;)

+4

Works comme de 'PHP v5.4', syntaxe illégale dans' PHP <= v5.3' –

Répondre

15

I wouldn Ne vous préoccupez pas de cette variable supplémentaire, vraiment. Si vous voulez, cependant, vous pouvez également 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 appeler cela avec:

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

Le tableau doit être détruit automatiquement maintenant.

+0

@onnodb, 'des normes strictes: Seules les variables doivent être transmises par reference' pour votre fonction 'indexonce'. Pourquoi ajoutez-vous la référence '&'? – Pacerier

38

La réponse technique est que le Grammaire du langage PHP permet uniquement la notation indice sur la fin de expressions variables et non expressions en général, ce qui est de savoir comment cela fonctionne dans la plupart des autres langues. Je l'ai toujours considéré comme une déficience dans le langage, parce qu'il est possible d'avoir une grammaire qui résout les indices contre toute expression sans ambiguïté. Il pourrait cependant être le cas, ils utilisent un générateur d'analyseur inflexible ou ils ne veulent tout simplement pas rompre une sorte de rétrocompatibilité.

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

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

+11

Le statut est maintenant changé en accepté http://wiki.php.net/rfc/ functionarraydereferencing –

+3

Cette réponse n'est plus correcte. Depuis la version 5.5, PHP supporte le déréférencement constant/array/string https://wiki.php.net/rfc/constdereference – Mbrevda

0

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

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

En fait, il y a une solution élégante :) Ce qui suit affectera le 3ème élément du tableau renvoyé par myfunc à $ myvar:

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

Clever? Oui! Élégant? non. –

2
function doSomething() 
{ 
    return $somearray; 
} 

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

Comment pourriez-vous faire 'get (1)' sur un tableau? Erreur irrécupérable: appel à une fonction membre get() sur un non-objet dans file.php à la ligne 21 – Pacerier

5

Cela pourrait ne pas être lié directement .. Mais je suis venu à cette solution après la recherche de ce problème spécifique.

J'ai reçu un résultat d'une fonction sous la forme suivante.

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

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

array_pop(array_pop(the_function_which_returned_the_above_array())) 

Ainsi, il a été fait dans une ligne :) espère que ce serait utile à quelqu'un.

+0

Cela ne fonctionne que sur la dernière valeur et vous supprimerez la valeur du ** tableau d'origine **. – Pacerier

0

Il y a plusieurs vous pourriez Citations venir avec, en utilisant php array_ * fonctions. Mais je vous assure que cela est totalement redondant en comparant ce que vous voulez réaliser. Exemple: vous pouvez utiliser quelque chose comme suivre, mais ce n'est pas une solution élégante et je ne suis pas sûr de la performance de cela;

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 vous êtes coincé avec une ancienne version de php, la plupart des cadres a aider les bibliothèques.

exemple: Codeigniter aides tableau