Verwenden von geschweiften Klammern mit dynamischen Variablennamen in PHP

Ich versuche dynamische Variablennamen zu verwenden (ich bin mir nicht sicher, wie sie eigentlich heißen). Aber ziemlich genau so:

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

Die Rückgabe ist null was mir sagt, dass es nicht funktioniert. Ich habe keine Ahnung, wo die Syntax oder die Technik, nach der ich suche, liegt, was die Recherche erschwert. $filelist ist früher definiert.

Wickeln Sie sie in {} :

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

Arbeitsbeispiel


Mit ${} können Sie dynamische Variablen erstellen, ein einfaches Beispiel:

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

Überblick

In PHP können Sie einfach ein zusätzliches $ vor eine Variable setzen, um daraus eine dynamische Variable zu machen:

 $$variableName = $value; 

Obwohl ich es nicht empfehlen würde, könnte man dieses Verhalten sogar verketten:

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

Sie können, müssen aber nicht $variableName zwischen {} :

 ${$variableName} = $value; 

Die Verwendung von {} ist nur dann obligatorisch, wenn der Name Ihrer Variablen selbst eine Zusammensetzung mehrerer Werte ist, beispielsweise:

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

Es wird jedoch empfohlen, immer {} , da es besser lesbar ist.

Unterschiede zwischen PHP5 und PHP7

Ein weiterer Grund für die Verwendung von {} ist, dass PHP5 und PHP7 eine etwas andere Art des Umgangs mit dynamischen Variablen haben, was in einigen Fällen zu einem anderen Ergebnis führt.

In PHP7 werden dynamische Variablen, Eigenschaften und Methoden nun streng von links nach rechts ausgewertet, im Gegensatz zu den Sonderfällen in PHP5. Die folgenden Beispiele zeigen, wie sich die Reihenfolge der Auswertung geändert hat.

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

  • PHP5 Interpetation: ${$foo['bar']['baz']}
  • PHP7 Interpetation: ${$foo}['bar']['baz']

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

  • PHP5 Interpetation: $foo->{$bar['baz']}
  • PHP7 interpetation: $foo->{$bar}['baz']

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

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

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

  • PHP5 interpetation: Foo::{$bar['baz']}()
  • PHP7 interpetation: Foo::{$bar}['baz']()

Verwenden Sie {} anstelle von () :

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

Ich mache das ziemlich oft auf Ergebnisse von einer Abfrage zurückgegeben ..

z.B

 // $MyQueryResult is an array of results from a query foreach ($MyQueryResult as $key=>$value) { ${$key}=$value; } 

Jetzt kann ich einfach $ MyFieldname verwenden (was in Echo-Statements einfacher ist) als $ MyQueryResult [‘MyFieldname’]

Ja, es ist wahrscheinlich faul, aber ich hatte nie Probleme.

Tom, wenn Sie ein bestehendes Array haben, können Sie dieses Array in ein Objekt konvertieren und es so verwenden:

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

Ich habe eine Lösung für dynamisch erzeugten Variablenwert und kombinierte alle Werte in einer Variablen.

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

Ich war in einer Position, in der ich 6 identische Arrays hatte und ich musste das richtige auswählen, abhängig von einer anderen Variablen und dann Werte zuweisen. In dem hier gezeigten Fall war $ comp_cat ‘a’, also musste ich mein ‘a’ Array auswählen (ich hatte natürlich auch ‘b’ bis ‘f’ Arrays)

Beachten Sie, dass die Werte für die Position der Variablen im Array nach der schließenden geschweiften Klammer liegen.

$ {‘comp_cat _’. $ comp_cat .’_ arr ‘} [1] [0] = “FRED BLOGGS”;

$ {‘comp_cat _’. $ comp_cat .’_ arr ‘} [1] [1] = $ datei_tidy;

echo ‘Erster Array-Wert ist’. $ comp_cat_a_arr [1] [0]. ‘ und der zweite Wert ist $ comp_cat_a_arr [1] [1];