Verwenden von geschweiften Klammern mit dynamischen Variablennamen in PHP

191

Ich versuche, dynamische Variablennamen zu verwenden (ich bin nicht sicher, wie sie tatsächlich heißen). Aber ziemlich ähnlich:

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

var_dump($file0);

Die Rückkehr nullsagt mir, dass es nicht funktioniert. Ich habe keine Ahnung, nach welcher Syntax oder Technik ich suche, was die Recherche erschwert. $filelistwird früher definiert.

user1159454
quelle
22
Nicht ! Es gibt nie einen guten Grund, sie zu benutzen. Sie sind praktisch nur ein unordentliches Array. Verwenden Sie stattdessen ein geeignetes Array.
Quentin
Okay, es tut mir leid, ich bin einfach zurückgegangen und habe eine Antwort auf jede Frage ausgewählt, die ich bisher gestellt habe. Gut, dass es nur 7: P
user1159454
2
Und Quentin, warum sind sie schlechte Praxis? Es muss einen Grund geben, warum sie neben Arrays existieren, denke ich
user1159454
@ user1159454 - Sie sind ein unorganisiertes Durcheinander ohne alle Tools, die auf Arrays angewendet werden können, die ihnen zur Verfügung stehen. Sie existieren aus alten Gründen und verrückten Randfällen.
Quentin
8
Verrückte Randfälle können genau der Grund sein, warum jemand diese Frage stellen möchte.
Vincent

Antworten:

511

Wickeln Sie sie ein {}:

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

Arbeitsbeispiel


Mit ${}können Sie dynamische Variablen erstellen. Ein einfaches Beispiel:

${'a' . 'b'} = 'hello there';
echo $ab; // hello there
Sarfraz
quelle
4
Ist es auch möglich, dynamische Arrays mit derselben Logik zu erstellen?
Dtakis
Ich habe den gleichen Zweifel an @dtakis, können Sie uns helfen? Wenn möglich, werfen Sie bitte einen Blick auf diese Frage .
Marcio Mazzucato
Wenn Sie dies verwenden, um eine Variable einzuschließen (der meiner Meinung nach nützlichste Weg), vergessen Sie nicht, doppelte Anführungszeichen zu verwenden. ${'fixedTime$i'} = $row['timeInstance'];gibt Ihnen eine nicht sehr nützliche $fixedTime$ianstelle von $fixedTime1, $fixedTime2etc. (Zum Glück fast sofort entdeckt.)
BeNice
81

Überblick

In PHP können Sie $einer Variablen einfach ein Extra hinzufügen, um sie zu einer dynamischen Variablen zu machen:

$$variableName = $value;

Ich würde es zwar nicht empfehlen, aber Sie könnten dieses Verhalten sogar verketten:

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

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

${$variableName} = $value;

Die Verwendung {}ist nur obligatorisch, wenn der Name Ihrer Variablen selbst aus mehreren Werten besteht, wie folgt:

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

Es wird dennoch empfohlen, immer zu verwenden {}, da es besser lesbar ist.

Unterschiede zwischen PHP5 und PHP7

Ein weiterer Grund, immer zu verwenden {} ist, dass PHP5 und PHP7 etwas anders mit dynamischen Variablen umgehen, was in einigen Fällen zu einem anderen Ergebnis führt.

In PHP7 werden dynamische Variablen, Eigenschaften und Methoden jetzt streng in der Reihenfolge von links nach rechts ausgewertet, im Gegensatz zu der Mischung von Sonderfällen in PHP5. Die folgenden Beispiele zeigen, wie sich die Reihenfolge der Bewertung 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']()
John Slegers
quelle
6
Eine gute Antwort auf ein zweifelhaftes Thema. Ich bin wirklich froh, dass ich solchen Code nicht debuggen muss.
Martinstoeckli
4
beste Antwort, da es nur die Frage beantwortet, ohne zu urteilen
Rid Iculous
2
Ja, wir hatten gerade auch Probleme mit altem Code. Die Produktion war PHP5.5, die Entwicklungsumgebung war PHP7. Ich bevorzuge diese Frage.
Ogier Schelvis
20

Versuchen Sie es {}anstelle von ():

${"file".$i} = file($filelist[$i]);
Joakim Johansson
quelle
1
aus dem phpNET-Handbuch 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

Ich mache das ziemlich oft bei Ergebnissen, die von einer Abfrage zurückgegeben wurden.

z.B

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

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

Jetzt kann ich nur noch $ MyFieldname (was in Echoanweisungen usw. einfacher ist) anstelle von $ MyQueryResult ['MyFieldname'] verwenden.

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

Tom
quelle
14
Haben Sie jemals versucht, die extract () - Funktion von PHP zu verwenden? php.net/manual/en/function.extract.php
DarkSide
1
handlicher Einzeiler für DB-Ergebnismengen: foreach ($ row als $ k => $ v) {$$ k = $ v}
Rid Iculous
2

Tom, wenn Sie ein vorhandenes Array haben, können Sie dieses Array in ein Objekt konvertieren und wie folgt verwenden:

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

Ich habe eine Lösung für dynamisch erstellten 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;
}
Murad
quelle
0

Ich war in einer Position, in der ich 6 identische Arrays hatte, und ich musste abhängig von einer anderen Variablen das richtige auswählen und ihm 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 Klammer stehen.

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

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

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

M61Vulcan
quelle
0

Versuchen Sie es mit {} anstelle von ():

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