Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
VariablenNamen in for Schleife erzeugen/ändern ? [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
VariablenNamen in for Schleife erzeugen/ändern ?


 
janein
07-04-2008, 12:46 
 
Eine abzufragende Variable muss sich bei jedem Durchlauf ändern. Deshalb versuche ich diese aus $t.$m zusammenzusetzen. Das geht aber nicht. Wie geht es?

for($m =0;$m < 12;$m++)
{
if ($monat[1] == $m)
{
if (!isset($t.$i))
{
echo "$i";
$t.$i = true;
}
echo "Inhalt";
}
}

 
jahlives
07-04-2008, 12:49 
 
${$t.$i} = true;

Und so?

 
unset
07-04-2008, 12:50 
 
Variable Variablen zeugen in der Regel von einem Design-Fehler. Ich würde auch den Teufel tun das zu empfehlen.

 
jahlives
07-04-2008, 12:59 
 
Variable Variablen zeugen in der Regel von einem Design-Fehler. Ich würde auch den Teufel tun das zu empfehlen.

Gebe ich dir absolut recht. Nur der TS wollte es so... ;)

 
janein
07-04-2008, 13:12 
 
Original geschrieben von unset
Variable Variablen zeugen in der Regel von einem Design-Fehler. Ich würde auch den Teufel tun das zu empfehlen.
Wo ist in dem Eingangsposting der Designfehler?

Ich möchte mit diesem code alle Monate abfragen und in jeder Abfrage muss eine neue Variable auf null gesetz werden. Was empfiehlst Du für dieses Problem?

Ich habe es jetzt so gemacht, und es geht. Allerdings mit haufenweisen
Notice: Undefined variable: t ...

Wie vermeide ich die wo doch nur t angemeckert wird aber die var var doch t1 - t12 heißt?

...
if (!isset(${$t.$m}))
{
fprintf($fp, $format, "$t$m");
${$t.$m} = true;
}
...

 
jahlives
07-04-2008, 13:18 
 
Woher resp wo wird $t definiert?

Deshalb versuche ich diese aus $t.$m zusammenzusetzen

Darum verwendest du beim Zusammensetzen $i :rolleyes:

Was empfiehlst Du für dieses Problem?

z.B. Arrays

Gruss

tobi

 
janein
07-04-2008, 13:21 
 
Original geschrieben von jahlives
... z.B. Arrays ...


Ok, diese Notice: Undefined variable: t ... bin ich durch $t=""; vor der Schleife losgeworden.

Warum ist das ein Designfehler und wie und warum sollte ein array in diesem Fall besser sein?

 
unset
07-04-2008, 13:35 
 
Original geschrieben von janein
Warum ist das ein Designfehler und wie und warum sollte ein array in diesem Fall besser sein? [/B]
Der erste Designfehler ist schonmal, dass du nichtssagende Variablennamen benutzt. Was ist $t? Woher kommt $i? Meinst du evtl. $m? Außerdem wissen wir nicht genau, was du machen willst.

 
janein
07-04-2008, 13:49 
 
Es solle eine Art Kalender Gliederung erzeugt werden.

$m = wird in der for Schleife erzeugt und soll die Monate repräsentieren.
$t = wird nur verwendet, um sich von $m zu unterscheiden, da sie bei jedem Durchlauf false sein soll. So soll ein Array durchlaufen und unter dem Monatsnamen einsprechenden Werte aus den Monaten ausgegeben werden.
($i ist überflüssig)


$t="";
for($m =0;$m < 12;$m++)
{
if ($monat == $m)
{
if (!isset(${$t.$m}))
{
echo $t$m;

${$t.$m} = true;
}

}
}

 
jahlives
07-04-2008, 13:59 
 
Meine Frage wäre noch: Ändert sich $t jemals oder ist das immer ein Leerstring? Wenn immer Leerstring, warum dann verknüpfen? Das würde ja auf's gleiche herauskomen wie ${$m}

 
janein
07-04-2008, 14:11 
 
Original geschrieben von jahlives
... Ändert sich $t jemals oder ist das immer ein Leerstring? ...[/B]
Nein, also --> ${$m}

Noch einmal meine Frage: Warum und wie wäre eine Array besser als ${$m}?

 
PHP-Desaster
07-04-2008, 14:13 
 
$t[$m]ist zum Beispiel viel besser!!

 
jahlives
07-04-2008, 14:21 
 
Noch einmal meine Frage: Warum und wie wäre eine Array besser als ${$m}?

Alleine um festzustellen wieviele Werte (Vars du hast) bieten sich Array an. Bei deiner Version hast du sonst so 'aussagekräfte' Varnamen wie z.B. $0 und $1, die afaik in PHP üngültig wären, da Vars nicht mit Zahlen beginnen dürfen

 
janein
07-04-2008, 14:34 
 
Original geschrieben von PHP-Desaster
$t[$m]ist zum Beispiel viel besser!!
So habe ich es gemacht, doch jetzt hagelt es mehr den je

Notice: Undefined offset:
Vorher gab es die nicht mit ${$m}. Diese blöden offset Meldung plagen mich irgendwie und ich weis wieder nicht wie ich sie loswerden kann
$t0""; bringt nichts.
$t = "";
for($m =0;$m < 12;$m++)
{
if ($monat[1] == $t[$m])
{
if (!isset($t[$m]))
{
$monatstr = array("Aprill","Mai","Juni");
fprintf($fp, $format, "$t[$m]");

$t[$m] = true;
}

 
Quetschi
07-04-2008, 14:37 
 
Original geschrieben von janein
Warum ist das ein Designfehler und wie und warum sollte ein array in diesem Fall besser sein?Als ich mit PHP begonnen hab, hab ich auch mit variablen Variablennamen rumgemacht - warum? Weils in dem Buch gestanden ist, mit dem ich PHP zu lernen angefangen hab. Das Buch find ich heute immer noch ned schlecht für nen Einsteiger, aber die Seiten wo das mit den variablen Variablennamen drankam gehören rausgerissen - ich hatte mir damals einen sehr schlechten, teils äußerst umständlichen Programmierstil angewohnt :mad:

@janein
Ich habe die Erfahrung gemacht dass alles was man mit variablen Variablennamen machen will, sehr viel besser/bequemer mit Arrays geht. Ich sehe deshalb so ein Rumgewürge prinzipiell auch als "Designfehler" an.

Nimm Arrays :)

Nimm dir mal etwas Zeit und schau dir die Latte an Funktionen an, die es im Zusammenhang mit Arrays gibt -> http://de.php.net/array
Du wirst schnell sehen, dass sie dir evtl. viel Arbeit abnehmen, die du dir bisher gemacht hast, wenn du Arrays noch nicht sonderlich eingesetzt hast.

 
jahlives
07-04-2008, 14:37 
 
So wie du den Code jetzt hast wundert micht das nicht. $t ist ein String und kein Array. Ausserdem ist's ein Leerstring, somit kannst du nicht auf die einzelnen Zeichen des Strings mit $string[pos] zugreifen. Mach das ganze erstmal zum Array

 
janein
07-04-2008, 14:46 
 
Original geschrieben von Quetschi
...
Ich habe die Erfahrung gemacht dass alles was man mit variablen Variablennamen machen will, sehr viel besser/bequemer mit Arrays geht. Ich sehe deshalb so ein Rumgewürge prinzipiell auch als "Designfehler" an.

Nimm Arrays :) ...


Mache ich ja jetzt -->$t[$m] nur komme ich mit diese offset Meldunge nicht klar. Obwoh $t[]= ""; gesetzt ist: Haufenweise offset Meldungen ...

@jahlives
Ja, habe ich beides probiert:
$t= "";
$t[]= "";
Die offset Meldungen bleiben ...

 
jahlives
07-04-2008, 14:56 
 
Überleg mal was dieser Code macht

$t = "";
for($m =0;$m < 12;$m++)
{
if ($monat[1] == $t[$m])
{
if (!isset($t[$m]))
{
$monatstr = array("Aprill","Mai","Juni");
fprintf($fp, $format, "$t[$m]");

$t[$m] = true;
}

Also erster Durchlauf: $m ist 0 und $monat[1] irgendein String. In dein äusseres if kommst du nur rein wenn $monat[1] ein Leerstring ist, was im ersten Durchlauf wohl nicht der Fall ist. Also geht's in den else-Zweig deines Codes und damit wird das Array nicht geändert. Jetzt beim nächsten Durchlauf ist $m 1 und das Array hat kein Element 1 --> Fehlermeldung seitens PHP. Schreib mal direkt nach dem äusseren if die('Komme rein'). Ich wette eine Flasche Bier, dass diese Ausgabe nie erscheinen wird.

 
Quetschi
07-04-2008, 14:58 
 
Original geschrieben von janein
Mache ich ja jetzt -->$t[$m] nur komme ich mit diese offset Meldunge nicht klar. Obwoh $t[]= ""; gesetzt ist: Haufenweise offset Meldungen ... Ich hab noch nicht ganz verstanden, was du da für eine Datenstruktur hast/brauchst. Glaub dass du da aber mit den variablen Variablennamen vielleicht generell einen unpassenden Ansatz gewählt hast.

Was soll da am Ende dabei rauskommen? So ganz hab ich da dein Post dazu weiter oben ned verstanden.

 
janein
07-04-2008, 15:43 
 
So, ich habs jetzt :-)
for($m =0;$m < 12;$m++)
{
if ( $monat[1] == $m)
{

if (!isset($t[$m]))
{
$monat = array("Janurar","Februar","März","Aprill","Mai","Juni",
"Juli","August","September","Oktober","November","Dezember");
fprintf($fp, $format, $monat[$m]);

$t[$m] = true;
}
fputs($fp, "<a href='$value[0]'>$value[1]</a> <b>$value[4]</b> [$value[3]] $value[2]<br>\n");
}
}
}
Gibt's noch etwas zu verbessern?

 
H2O
07-04-2008, 15:52 
 
Original geschrieben von janein
Gibt's noch etwas zu verbessern? Nimm die Definition der Monate aus der Schleife raus, die müssen ja nicht in jedem Durchgang neu gesetzt weden. Und ob der Janu so rar ist, oder der Aprill wirklich so sein will, musst du selber entscheiden.

 
jahlives
07-04-2008, 16:02 
 
Nimm die Definition der Monate aus der Schleife raus, die müssen ja nicht in jedem Durchgang neu gesetzt weden.

V.a. wenn man keine Fehlermeldungen bezüglich undefinierter Var haben will ;)

 
janein
07-04-2008, 16:16 
 
Original geschrieben von H2O
Nimm die Definition der Monate aus der Schleife raus, die müssen ja nicht in jedem Durchgang neu gesetzt weden. Und ob der Janu so rar ist, oder der Aprill wirklich so sein will, musst du selber entscheiden. :-)

Original geschrieben von jahlives
V.a. wenn man keine Fehlermeldungen bezüglich undefinierter Var haben will ;) :-)

So?
also mit einer neuen Zuweisung

$monate = array("Janurar","Februar","März","Aprill","Mai","Juni",
"Juli","August","September","Oktober","November","Dezember");

for($m =0;$m < 12;$m++)
{
if ( $monat[1] == $m)
{

if (!isset($t[$m]))
{
$monat = $monate;

fprintf($fp, $format, $monat[$m]);

$t[$m] = true;
}
fputs($fp, "<a href='$value[0]'>$value[1]</a>
<b>$value[4]</b> [$value[3]] $value[2]<br>\n");
}
}
}

 
janein
07-04-2008, 19:29 
 
Ist $monat = $monate; nur übersichtlicher und wird dennoch jedesmal neu zugewiesen oder ist es auch schneller, weil nichts mehr zugewiesen sondern nur eine Kopie erstellt wird? Ist doch richtig mit der Kopie und $monat = $monate; oder?

Und vielen Dank für Eure guten Ratschläge!

 
H2O
08-04-2008, 08:35 
 
Original geschrieben von janein
Ist $monat = $monate; nur übersichtlicher und wird dennoch jedesmal neu zugewiesen oder ist es auch schneller, weil nichts mehr zugewiesen sondern nur eine Kopie erstellt wird? Ist doch richtig mit der Kopie und $monat = $monate; oder? Völlig überflüssig. Das Array $monate steht doch auch in der Schleife zur Verfügung. Was willst du da denn noch einer anderen Variablen zuweisen?

- -

Alle Zeitangaben in WEZ +2. Es ist jetzt 23:24 Uhr.