web-dev-qa-db-fra.com

Utiliser des accolades avec des noms de variables dynamiques dans PHP

J'essaie d'utiliser des noms de variables dynamiques (je ne sais pas comment ils s'appellent), mais à peu près comme ceci:

for($i=0; $i<=2; $i++) {
    $("file" . $i) = file($filelist[$i]);
}

var_dump($file0);

Le retour est null qui me dit que cela ne fonctionne pas. Je ne sais pas du tout quelle est la syntaxe ou la technique que je cherche, ce qui rend la recherche difficile. $filelist est défini plus tôt.

161
user1159454

Enveloppez-les dans {}:

${"file" . $i} = file($filelist[$i]);

Exemple de travail


Utiliser ${} est un moyen de créer des variables dynamiques, exemple simple:

${'a' . 'b'} = 'hello there';
echo $ab; // hello there
440
Sarfraz

Vue d'ensemble

En PHP, vous pouvez simplement mettre un $ supplémentaire devant une variable pour en faire une variable dynamique:

$$variableName = $value;

Bien que je ne le recommande pas, vous pouvez même enchaîner ce comportement:

$$$$$$$$DoNotTryThisAtHomeKids = $value;

Vous pouvez mais n'êtes pas obligé de mettre $variableName entre {}:

${$variableName} = $value;

L'utilisation de {} n'est obligatoire que lorsque le nom de votre variable est lui-même une composition de plusieurs valeurs, comme ceci:

${$variableNamePart1 . $variableNamePart2} = $value;

Il est néanmoins recommandé de toujours utiliser {}, car il est plus lisible.

Différences entre PHP5 et PHP7

Une autre raison de toujours utiliser {} est que PHP5 et PHP7 ont une manière légèrement différente de traiter les variables dynamiques, ce qui entraîne un résultat différent dans certains cas.

En PHP7, les variables dynamiques, les propriétés et les méthodes seront maintenant évaluées strictement dans un ordre de gauche à droite, par opposition à la combinaison de cas spéciaux en PHP5. Les exemples ci-dessous montrent comment l'ordre d'évaluation a changé.

Cas 1: $$foo['bar']['baz']

  • Interprétation PHP5: ${$foo['bar']['baz']}
  • Interprétation PHP7: ${$foo}['bar']['baz']

Cas 2: $foo->$bar['baz']

  • Interprétation PHP5: $foo->{$bar['baz']}
  • Interprétation PHP7: $foo->{$bar}['baz']

Cas 3: $foo->$bar['baz']()

  • Interprétation PHP5: $foo->{$bar['baz']}()
  • Interprétation PHP7: $foo->{$bar}['baz']()

Cas 4: Foo::$bar['baz']()

  • Interprétation PHP5: Foo::{$bar['baz']}()
  • Interprétation PHP7: Foo::{$bar}['baz']()
66
John Slegers

Essayez d'utiliser {} au lieu de ():

${"file".$i} = file($filelist[$i]);
20
Joakim Johansson

Je le fais assez souvent sur les résultats renvoyés par une requête.

par exemple.

// $MyQueryResult is an array of results from a query

foreach ($MyQueryResult as $key=>$value)
{
   ${$key}=$value;
}

Maintenant, je peux simplement utiliser $ MyFieldname (ce qui est plus facile dans les instructions echo, etc.) plutôt que $ MyQueryResult ['MyFieldname']

Oui, c'est probablement paresseux, mais je n'ai jamais eu de problèmes. 

4
Tom

Tom, si vous avez un tableau existant, vous pouvez convertir ce tableau en objet et l'utiliser comme ceci:

$r = (object) $MyQueryResult;
echo $r->key;
2
corysus

Essayez d’utiliser {} au lieu de ():

${"file".$i} = file($filelist[$i]);
0
Vildan Bina

J'étais dans une position où j'avais 6 tableaux identiques et je devais choisir le bon en fonction d'une autre variable, puis lui attribuer des valeurs. Dans le cas présenté ici, $ comp_cat était 'a' donc j’avais besoin de choisir mon tableau 'a'

Notez que les valeurs pour la position de la variable dans le tableau vont après l'accolade de fermeture.

$ {'comp_cat _'. $ comp_cat .'_ arr '} [1] [0] = "FRED BLOGGS";

$ {'comp_cat _'. $ comp_cat .'_ arr '} [1] [1] = $ file_tidy;

echo 'La première valeur du tableau est'. $ comp_cat_a_arr [1] [0]. ' et la deuxième valeur est. $ comp_cat_a_arr [1] [1];

0
M61Vulcan

j'ai une solution pour la valeur de variable créée dynamiquement et combinée toutes les valeurs dans une variable.

if($_SERVER['REQUEST_METHOD']=='POST'){
    $r=0;
    for($i=1; $i<=4; $i++){
        $a = $_POST['a'.$i];
        $r .= $a;
    }
    echo $r;
}
0
Murad