Pointer auf array wird nicht weitergestellt next($arr)
Kalle_B
- php
Hallöle,
schon wieder eine Knobelei. In PHP3 lief es noch, jetzt mault PHP4.
Ich ersetze Platzhalter (hier [PHP_SELF])in einer Zeile
<form class=f001 name='form001' action='[PHP_SELF]' method='post'>
mit Hilfe eines assoziativen Arrays:
$arr = array(
'segment' => 'kopf'
,'[owner_titel]' => $row_own['titel']
,'[PHP_SELF]' => $_SERVER['PHP_SELF']
,'[kennwort]' => $kennwort
,'[last_login]' => $last_login
,'[fehler1]' => 'nodisp'
);
und zwar so:
// ALLE PLATZHALTER IN DIESER ZEILE ERSETZEN
reset( $arr );
while ($field = current( $arr )) {
echo "suche [".key( $arr )."] [".$field."]<br>\n";
// mixed str_replace ( mixed search, mixed replace, mixed subject [, int &count] )
$zeile = str_replace( key( $arr ), $field, $zeile );
next( $arr );
}
echo $zeile;
durch das eingebaute echo sehe ich immer nur
suche [segment] [kopf]
das next( $arr ) scheint in PHP4 nicht zu wirken, obwohl es sollte:
http://de3.php.net/next
Lieben Gruß, Kalle
Hallo Kalle,
schon wieder eine Knobelei. In PHP3 lief es noch, jetzt mault PHP4.
// ALLE PLATZHALTER IN DIESER ZEILE ERSETZEN
reset( $arr );
while ($field = current( $arr )) {
echo "suche [".key( $arr )."] [".$field."]<br>\n";
// mixed str_replace ( mixed search, mixed replace, mixed subject [, int &count] )
$zeile = str_replace( key( $arr ), $field, $zeile );
next( $arr );
}
echo $zeile;
warum nutzt Du nicht den Code aus dem Handbuch, Abschnitt foreach, unter Verwendung von each()? Das sollte das genaue Äquivalent in PHP3 zur foreach-Schleife in PHP4 (aufwärts) sein.
Freundliche Grüße
Vinzenz
Hallo Vinzenz,
warum nutzt Du nicht den Code aus dem Handbuch, Abschnitt foreach, unter Verwendung von each()? Das sollte das genaue Äquivalent in PHP3 zur foreach-Schleife in PHP4 (aufwärts) sein.
Ich möchte mit denselben PHP- Programmen bei ZWEI Providern arbeiten. Beim alten läuft PHP 3.0.18 und beim neuen 4.3.10
Grund: Meine alte Programmversion ist PHP3 und muss zum Vergleich beim alten Provider weiterlaufen.
Die neue Programmversion soll (zum Vergleich) noch auf die alte MySQL zugreifen können, deswegen muss sie auch beim alten Provider laufen können.
Ist ein gemeinsamer Programmcode ausgeschlossen?
Lieben Gruß, Kalle
Hallo Kalle,
Ich möchte mit denselben PHP- Programmen bei ZWEI Providern arbeiten. Beim alten läuft PHP 3.0.18 und beim neuen 4.3.10
Grund: Meine alte Programmversion ist PHP3 und muss zum Vergleich beim alten Provider weiterlaufen.
Ist ein gemeinsamer Programmcode ausgeschlossen?
Nein, gemeinsamer Programmcode ist nicht ausgeschlossen. Aber bitte halte ihn so einfach wie es geht. Bist Du meinem Link nicht gefolgt?
<zitat>
Auch hier funktioniert alles gleich:
<?php
$arr = array("eins", "zwei", "drei");
reset ($arr);
while (list($key, $value) = each ($arr)) {
echo "Schlüssel: $key; Wert: $value<br />\n";
}
foreach ($arr as $key => $value) {
echo "Schlüssel: $key; Wert: $value<br />\n";
}
?>
</zitat>
Die erstere Variante funktioniert auch unter PHP3 und sieht wesentlich einfacher aus als Dein Konstrukt.
Freundliche Grüße
Vinzenz
Hallo Vinzenz,
Nein, gemeinsamer Programmcode ist nicht ausgeschlossen. Aber bitte halte ihn so einfach wie es geht. Bist Du meinem Link nicht gefolgt?
Doch, aber da steht ausdrücklich PHP4, löst mein Problem nicht:
"foreach
PHP 4 (nicht PHP 3) enthält ein foreach Konstrukt ..."
Warum der next() hängt, habe ich herausgefunden:
$arr2 = array(
'segment' => 'kopf'
,'[owner_titel]' => ''
,'[PHP_SELF]' => $_SERVER['PHP_SELF']
,'[kennwort]' => 'Kalle'
,'[last_login]' => 'gestern'
,'[fehler1]' => 'nodisp'
);
Bei [owner_titel] springt er raus aus der while-Schleife, wird in PHP4 (anders als in PHP3) offenbar FALSE:
while ( $field = current( $arr2 ) ) { ... }
reset ($arr);
while (list($key, $value) = each ($arr)) {
echo "Schlüssel: $key; Wert: $value<br />\n";
}
Ja, das funzt in BEIDEN Versionen trotz '' (ist das NULL?).
Danke dir, habe dazugelernt.
Kalle
hi,
Bei [owner_titel] springt er raus aus der while-Schleife, wird in PHP4 (anders als in PHP3) offenbar FALSE:
Ja, der Leerstring wird automatisch zu einem false evaluiert.
while ( $field = current( $arr2 ) ) { ... }
while ( ($field = current($arr2) !== false ) { ... }
gruß,
wahsaga
Hallo wahsaga,
Bei [owner_titel] springt er raus aus der while-Schleife, wird in PHP4 (anders als in PHP3) offenbar FALSE:
Ja, der Leerstring wird automatisch zu einem false evaluiert.
while ( $field = current( $arr2 ) ) { ... }
while ( ($field = current($arr2) !== false ) { ... }
die Anforderung des OP lautet: Kompatibilität zu PHP3 :-(( (noch viele Klammern mehr ...)
Freundliche Grüße
Vinzenz
Hallo Kalle,
Bei [owner_titel] springt er raus aus der while-Schleife, wird in PHP4 (anders als in PHP3) offenbar FALSE:
Ja, das funzt in BEIDEN Versionen trotz '' (ist das NULL?).
Nein, das ist der Leerstring. In PHP4 wurde der Boolsche Typ eingeführt. Wie Du dem Handbuch entnehmen kannst, entspricht wird Leerstring bei Umwandlung zum Boolschen Typ zu FALSE.
Deswegen gibt es seit PHP4 auch die Vergleichsoperatoren, die auf "identisch" bzw. "nicht identisch" prüfen. Diese kannst Du aus Kompatibilitätsgründen nicht verwenden.
Dir wurde ja bereits mehrfach gesagt, dass PHP 3.0.18 aus dem Jahr 2000 stammt. Allein aus Sicherheitsgründen sollte der Server besser abgeschaltet werden :-)
Freundliche Grüße
Vinzenz
Hello,
Hallöle,
schon wieder eine Knobelei. In PHP3 lief es noch, jetzt mault PHP4.
Ich ersetze Platzhalter (hier [PHP_SELF])in einer Zeile
<form class=f001 name='form001' action='[PHP_SELF]' method='post'>
mit Hilfe eines assoziativen Arrays:
$_arr = array(
'segment' => 'kopf'
,'[owner_titel]' => $row_own['titel']
,'[PHP_SELF]' => $_SERVER['PHP_SELF']
,'[kennwort]' => $kennwort
,'[last_login]' => $last_login
,'[fehler1]' => 'nodisp'
);
und zwar so?:
// ALLE PLATZHALTER IN DIESER ZEILE ERSETZEN
reset( $_arr );
while (list($key, $val) = each( $_arr ))
{
echo "suche $key => $val<br>\n";
$zeile = str_replace( $key, $val, $zeile );
}
echo $zeile;
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Hallo, Tom,
$_arr = array(
'segment' => 'kopf'
,'[owner_titel]' => ''
,'[PHP_SELF]' => $_SERVER['PHP_SELF']
,'[kennwort]' => $kennwort
,'[last_login]' => $last_login
,'[fehler1]' => 'nodisp'
);
und zwar so?:
// ALLE PLATZHALTER IN DIESER ZEILE ERSETZEN
reset( $_arr );
while (list($key, $val) = each( $_arr ))
{
echo "suche $key => $val<br>\n";
$zeile = str_replace( $key, $val, $zeile );
}
echo $zeile;
while (list($key, $val) = each( $_arr ))
überspringt in PHP3 Eintragungen mit $val = ''. Die brauche ich aber, um Platzhalter auch löschen zu können.
PHP4 nimmt die leeren $val auch, so soll es sein.
LG Kalle
Hello,
while (list($key, $val) = each( $_arr ))
überspringt in PHP3 Eintragungen mit $val = ''. Die brauche ich aber, um Platzhalter auch löschen zu können.
Kann ich mir zwar nicht vorstellen, aber
dann musst Du es eben so umbauen, dass es funktioniert.
list($key,$val) = each($_arr);
while($key)
{
echo "$key => $val\n";
list($key,$val) = each($_arr);
}
Wenn es nun so auch nicht funktioniert, habe ich wohl alle Tricks vergessen
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Hello,
Kann ich mir zwar nicht vorstellen, aber
dann musst Du es eben so umbauen, dass es funktioniert.list($key,$val) = each($_arr);
while($key)
{
echo "$key => $val\n";
list($key,$val) = each($_arr);
}
Klappt NICHT. Habe den each mal näher getestet:
Beispiel 1:
-----------
$arr = array (
'[key1]' => 'wert1'
,'[key2]' => 'wert2'
,'[key3]' => ''
,'[key4]' => 'wert4'
);
for (reset($arr); list($key, $value) = each($arr);) {
echo $key." => ".$value." .. ";
}
AUS: [key1] => wert1 .. [key2] => wert2 .. [key3] => .. [key4] => wert4
Beispiel 2 ($row['name'] NICHT definiert):
----------------------------------------
$arr = array (
'[key1]' => 'wert1'
,'[key2]' => 'wert2'
,'[key3]' => $row['name']
,'[key4]' => 'wert4'
);
for (reset($arr); list($key, $value) = each($arr);) {
echo $key." => ".$value." .. ";
}
AUS: [key1] => wert1 .. [key2] => wert2 .. [key4] => wert4
Kann es sein, dass die Code-Zeile
,'[key3]' => $row['name']
gar nicht ins array aufgenommen wird?
Kalle
Hello,
Kann ich mir zwar nicht vorstellen, aber
dann musst Du es eben so umbauen, dass es funktioniert.list($key,$val) = each($_arr);
while($key)
{
echo "$key => $val\n";
list($key,$val) = each($_arr);
}Klappt NICHT. Habe den each mal näher getestet:
Beispiel 2 ($row['name'] NICHT definiert):
$arr = array (
'[key1]' => 'wert1'
,'[key2]' => 'wert2'
,'[key3]' => $row['name']
,'[key4]' => 'wert4'
);
Das hier ist was ganz anderes, als ich Dir hingeschrieben hatte.
for (reset($arr); list($key, $value) = each($arr);) {
echo $key." => ".$value." .. ";
}
AUS: [key1] => wert1 .. [key2] => wert2 .. [key4] => wert4
Hast Du denn meinen Code mal mit PHP3 und PHP4 1:1 ausprobiert?
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Hallöle,
schon wieder eine Knobelei. In PHP3 lief es noch, jetzt mault PHP4.
Stunden später ... Trick gefunden mit angehängtem .''
Beispiel ( $unbekannt ist NICHT definiert )
-------------------------------------------
$arr = array (
'[key1]' => 'wert1'
,'[key2]' => 'wert2'
,'[key3]' => $unbekannt.''
,'[key4]' => 'wert4'
);
for (reset($arr); list($key, $value) = each($arr);) {
echo $key." => ".$value." .. ";
}
AUS: [key1] => wert1 .. [key2] => wert2 .. [key3] => .. [key4] => wert4
Bei dieser Try - and - error Methode kann man natürlich ein Projekt niemals fertig bekommen.
Kalle
Hello,
schon wieder eine Knobelei. In PHP3 lief es noch, jetzt mault PHP4.
Stunden später ... Trick gefunden mit angehängtem .''
Beispiel ( $unbekannt ist NICHT definiert )
$arr = array (
'[key1]' => 'wert1'
,'[key2]' => 'wert2'
,'[key3]' => $unbekannt
,'[key4]' => 'wert4'
);
Lass Dir dieses Array bitte mal mit Var_Dump() in PHP3 und in PHP4 ausgeben und erzähl uns die Ergebnisse. Ich glaube, Du schraubst an der falschen Stelle.
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom