Kalle_B: Pointer auf array wird nicht weitergestellt next($arr)

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

  1. 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

    1. 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

      1. 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

        1. 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

          1. 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

            --
            /voodoo.css:
            #GeorgeWBush { position:absolute; bottom:-6ft; }
            1. 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

          2. 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

  2. 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 =&gt; $val<br>\n";
              $zeile = str_replace( $key, $val, $zeile );
            }
            echo $zeile;

    Harzliche Grüße vom Berg
    http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau

    1. 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 =&gt; $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

      1. 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 =&gt; $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

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau

        1. 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 =&gt; $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." =&gt; ".$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." =&gt; ".$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

          1. 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 =&gt; $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." =&gt; ".$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

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau

  3. 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." =&gt; ".$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

    1. 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

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau