Utilisation d'accolades avec des noms de variables dynamiques en PHP


197

J'essaie d'utiliser des noms de variables dynamiques (je ne suis pas sûr de leur nom) mais à peu près comme ceci:

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

var_dump($file0);

Le retour est nullce qui me dit que cela ne fonctionne pas. Je n'ai aucune idée de la syntaxe ou de la technique que je recherche ici, ce qui rend la recherche difficile. $filelistest défini plus tôt.


24
Pas ! Il n'y a jamais de bonne raison de les utiliser. Ils ne sont, en fait, qu'un tableau désordonné. Utilisez plutôt une matrice appropriée.
Quentin

Très bien, je suis désolé, je suis juste retourné et j'ai choisi une réponse pour chaque question que j'ai posée jusqu'à présent. Bonne chose c'est seulement 7: P
user1159454

2
Et Quentin, pourquoi sont-ils une mauvaise pratique ?? Il doit y avoir une raison pour laquelle ils existent à côté de tableaux, je pense
user1159454

1
@ user1159454 - Ils sont un désordre désorganisé sans tous les outils qui peuvent être appliqués aux tableaux dont ils disposent. Ils existent pour d'anciennes raisons d'héritage et des cas extrêmes.
Quentin

8
Les cas extrêmes peuvent expliquer pourquoi quelqu'un voudrait poser cette question.
Vincent

Réponses:


527

Enveloppez-les dans {}:

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

Exemple de travail


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

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

4
Est-il également possible de créer des tableaux dynamiques avec la même logique?
dtakis le

J'ai le même doute sur @dtakis, pouvez-vous nous aider? Si possible, veuillez jeter un œil à cette question .
Marcio Mazzucato

Jut un avertissement si vous utilisez ceci pour inclure une variable (le moyen le plus utile à mon humble avis), n'oubliez pas d'utiliser des guillemets doubles. ${'fixedTime$i'} = $row['timeInstance'];vous donne un pas très utile $fixedTime$iau lieu de $fixedTime1, $fixedTime2etc. (heureusement repéré presque tout de suite.)
BeNice

86

Aperçu

En PHP, vous pouvez simplement mettre un extra $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 $variableNameentre {}:

${$variableName} = $value;

L'utilisation {}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 l'utiliser {}, car c'est plus lisible.

Différences entre PHP5 et PHP7

Une autre raison de toujours utiliser {}, c'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 désormais évaluées strictement dans l'ordre de gauche à droite, par opposition au mélange 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']()

7
Une bonne réponse à un sujet douteux. Je suis vraiment content de ne pas avoir à déboguer un tel code.
martinstoeckli

4
meilleure réponse car elle ne fait que répondre à la question sans
porter de

2
Ouais, nous avons juste eu des problèmes avec du code hérité également. La production était PHP5.5, l'environnement de développement était PHP7. Je privilégie cette question.
Ogier Schelvis


5

Je fais cela 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.


14
Avez-vous déjà essayé d'utiliser la fonction extract () de PHP? php.net/manual/en/function.extract.php
DarkSide

1
une ligne pratique pour les ensembles de résultats DB: foreach ($ row as $ k => $ v) {$$ k = $ v}
Rid Iculous

2

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;

0

J'ai une solution pour la valeur de variable créée dynamiquement et combiné toute la valeur 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

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 montré ici, $ comp_cat était 'a' donc je devais choisir mon tableau 'a' (j'avais aussi bien sûr des tableaux 'b' à 'f')

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

$ {'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

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

${"file".$i} = file($filelist[$i]);
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.