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.

user1159454
la source
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
Sarfraz
la source
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']()
John Slegers
la source
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
20

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

${"file".$i} = file($filelist[$i]);
Joakim Johansson
la source
1
à partir du manuel phpNET php.net/manual/ru/language.variables.variable.php $price_for_monday = 10; $price_for_tuesday = 20; $today = 'tuesday'; $price_for_today = ${ 'price_for_' . $today}; echo $price_for_today; // will return 20
Vladimir Ch
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.

À M
la source
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;
corysus
la source
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;
}
Murad
la source
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];

M61Vulcan
la source
0

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

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