Zur Navigation

Variablennamen aus weiteren Variablen aufbauen [war: PHP-Tricks]

1 Ranma (Gast)

Folgendes ist so ziemlich der älteste Trick in PHP, abgesehen davon, daß eine Foreach-Schleife viel komplizierter konstruiert werden mußte:

$Frage1=array('bla','blub');$Frage2=array('eins','zwei','drei');
$Frage3=array('a','b','c');$shortcut=array(1,2,3);
foreach($shortcut as $trick){print('<select name="Abfrage'.$trick.'">');
foreach($Frage$trick as $Antwort$trick){$val=key($Frage$trick);print('<option value="'$val'">'.$Antwort$trick.'</option>');}print('</select>');}

Jedenfalls habe ich wiederholt gelesen, daß man Variablennamen aus weiteren Variablen aufbauen könne. Nur leider funktioniert das nicht. Ersetzt man die Integer in $shortcut durch entsprechende Strings, dann funktioniert das trotzdem nicht. Ich bekam das mit keiner Variante hin.

Wurde die Möglichkeit aus den neueren Versionen von PHP herausgenommen? Oder gibt es eine Variante (die konkatenierte Variante $Frage.$trick habe ich möglicherweise noch vergessen auszuprobieren), die funktioniert und die ich nur noch nicht gefunden habe?
Ranma

29.09.2015 01:25

2 Jörg Kruse

So sollte es funktionieren:

foreach ($shortcut as $trick) {
    print('<select name="Abfrage'.$trick.'">');
    foreach (${"Frage".$trick} as $val => $Antwort) {
        print('<option value="'.$val.'">'.$Antwort.'</option>');
    }
    print('</select>');
}

Zur besseren Lesbarkeit empfehle ich übrigens grundsätzlich, den Code einzurücken - insbesondere bei Strukturblöcken wie foreach-Schleifen

29.09.2015 18:44

3 Ranma (Gast)

Einrücken bei Einzeilern?

Darf ich geschweifte Klammern überall hinsetzen? Das habe ich tatsächlich noch nie gesehen. Nur mit dem Punkt ging es übrigens wieder nicht. Damit wird der erste Teil der Variable als unbekannt bemeckert. Fast hätte ich die Doublequotes nicht verstanden. Vielleicht hatte ich es als $$abc$def oder so gesehen?
Ranma

30.09.2015 03:15

4 Jörg Kruse

Einrücken bei Einzeilern?

Mehrere Befehle in einer einzelnen Zeile unterzubringen, vermindert auch die Lesbarkeit. Ich habe den Code oben ausnahmsweise selbst auseinandergefriemelt - das nächste Mal wäre ich aber dankbar, wenn du diesen gleich in einer besser lesbaren Form präsentieren könntest.

Darf ich geschweifte Klammern überall hinsetzen?

Die geschweiften Klammern gehören wie das Dollarzeichen zum Variablennamen, sind allerdings optional:

$bla = 'blub';
echo ${bla};

Normalerweise werden diese Klammern auch weglassen - aber in zusammengesetzten Namen werden sie benötigt, um Anfang und Ende des Ausdrucks zu kennzeichnen

Nur mit dem Punkt ging es übrigens wieder nicht. Damit wird der erste Teil der Variable als unbekannt bemeckert.

Bei mir funktioniert der Code aus Beitrag 2 - damit werden drei Dropdownfelder angezeigt. Oberhalb der foreach Schleife musst du natürlich noch deine Zuordnungen von $Frage1 bis $shortcut ergänzen

30.09.2015 20:59

5 Ranma (Gast)

Oberhalb der foreach Schleife musst du natürlich noch deine Zuordnungen von $Frage1 bis $shortcut ergänzen

Ich muß was machen? Mir fällt jetzt erst das => $Antwort in der Bedingung der Foreach-Schleife auf. Den Teil habe ich also nicht eingebaut, aber bei mir funktioniert es jetzt auch. Also einfach in der Form, daß ich $Frage$trick ersetzt habe durch ${'Frage'.$trick}

Aber es funktioniert noch nicht, wenn ich das mit einem Element aus einem Array versuche. Also ${'Frage'.$trick[$i]} oder ${'Frage'.$trick.[$i]} oder ${'Frage'.$trick.'['.$i.']'} funktionieren alle nicht, sondern werfen Fehlermeldungen wie array to string conversion oder not initialized string oder undefined variable Array. Es ist nichtmal so, daß eine bestimmte Formulierung eine bestimmte Fehlermeldung wirft, sondern schon bei einer Wiederholung eines Versuches gehen die alle drei durcheinander.
Ranma

01.10.2015 04:05

6 Jörg Kruse

Auf ein einzelnes Element kannst du so zugreifen:

${'Frage'.$trick}[$i]

01.10.2015 10:29

7 Ranma (Gast)

Ja, das funktioniert. Danke.
Ranma

03.10.2015 01:59

8 Forum

Ich habe die beiden Fragestellungen in diesem Thread mal aufgeteilt, und den zweiten in einen eigenen Thread verschoben:

Script lokalisieren

Es ist besser, für jede Fragestellung einen eigenen Thread zu erstellen, so können andere, die z.B. über Suchemaschinen hierher kommen, leichter davon profitieren.

12.10.2015 18:18 | geändert von Jörg: 12.10.2015 18:21

Beitrag schreiben (als Gast)

Die Antwort wird nach der Überprüfung durch einen Moderator freigeschaltet.





[BBCode-Hilfe]