Jörg: Syntax $arr[$i]

Hallo.

for ($i=0; $i < count($arr); $i++) {
  echo $arr[$i];
}

wie geht's richtig? Ich hab mich schon halb tot probiert; hab irgendwas mit ner geschweiften Klammer in Erinnerung, aber den Sinn damals schon nicht verstanden gehabt, vergaß ich es wieder...

Ach ja, es geht mir natürlich nicht um die Ausgabe über Echo, sondern wie man den entsprechenden Wert im Array angibt.

Grüße
Jörg

  1. hi,

    for ($i=0; $i < count($arr); $i++) {
      echo $arr[$i];
    }

    wie geht's richtig?

    was soll daran nicht richtig sein?
    (wo ist deine problembeschreibung?)

    außer vielleicht der tatsache, dass man die abfrage count($arr) vielleicht vorher machen sollte (sofern sich am array in der schliefe nix ändert), der performance wegen.

    hab irgendwas mit ner geschweiften Klammer in Erinnerung, aber den Sinn damals schon nicht verstanden gehabt, vergaß ich es wieder...

    die dienen in der schreibweise $string{4} zum index-basierten zugriff auf die einzelnen zeichen eines strings. meinst du das?

    Ach ja, es geht mir natürlich nicht um die Ausgabe über Echo, sondern wie man den entsprechenden Wert im Array angibt.

    $array[nummerischer_index] _ist_ bei einem nummerischen array sicher nicht falsch.

    Was willst du jetzt eigentlich wissen?

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. hi,

      was soll daran nicht richtig sein?
      (wo ist deine problembeschreibung?)

      Ok, der ganze Code:

      <html>
      <?php
      include_once("verbinden.php");
      $eingabe_expl = explode("\n", $eingabe);
      echo "<pre>";
      print_r( $eingabe_expl );
      echo "</pre>";
      $anzahl = count($eingabe_expl);
      for ($i=0; $i < $anzahl; $i++) {
        echo $eingabe_expl[$i];
      }
      ?>
      <head>
      <meta http-equiv="content-type" content="text/html;charset=iso-8859-1">
      <meta name="generator" content="Adobe GoLive 6">
      <title>sort</title>
      <link href="css.css" rel="stylesheet" type="text/css">
      </head>

      <body bgcolor="#DDDDDD">
      <form action="sortieren.php" method="post">
      <textarea name="eingabe"></textarea>
      <input type="submit" value="go">
      </form>
      </body>
      </html>

      Problem: Die Ausgabe ist $eingabe_expl[0]$eingabe_expl[1] statt der Werte von $eingabe_expl[0] und $eingabe_expl[1]!

      Gruß
      Jörg

      1. hi,

        $eingabe_expl = explode("\n", $eingabe);

        welchen wert hat $eingabe?
        ist es ein array?

        Problem: Die Ausgabe ist $eingabe_expl[0]$eingabe_expl[1] statt der Werte von $eingabe_expl[0] und $eingabe_expl[1]!

        stammt diese ausgabe vom print_r(), oder vom echo in der schleife?

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
        1. hi,

          ist es ein array?

          ähm, unfug - bitte streichen.

          gruß,
          wahsaga

          --
          /voodoo.css:
          #GeorgeWBush { position:absolute; bottom:-6ft; }
        2. stammt diese ausgabe vom print_r(), oder vom echo in der schleife?

          Wenn ich ins Textarea-Feld folgendes eingebe:

          Ich bin ein Text, der bei jeder neuen Zeile
          explodieren soll, damit Zeile für Zeile in eine Datenbank
          eingetragen werden soll.

          Dann gibt mir oben stehende sortieren.php folgendes aus:

          Array
          (
              [0] => Ich bin ein Text, der bei jeder neuen Zeile
              [1] => explodieren soll, damit Zeile für Zeile in eine Datenbank
              [2] => eingetragen werden soll.
          )
          $eingabe_expl[0]$eingabe_expl[1]$eingabe_expl[2]

          Grüße,
          Jörg

          1. hi,

            puh - keine ahnung, was du da treibst :-)

            wenn ich dein beispiel aus https://forum.selfhtml.org/?t=104015&m=640913 kopiere, das einbinden von verbinden.php auskommentiere und den zugriff auf $eingabe gemäß meiner register_globals-einstellung durch $_POST['eingabe'] ersetze, erhalte ich bei eingabe deines textbeispiels die ausgabe

            Array
            (
                [0] => Ich bin ein Text, der bei jeder neuen Zeile
                [1] => explodieren soll, damit Zeile für Zeile in eine Datenbank
                [2] => eingetragen werden soll.
            )
            Ich bin ein Text, der bei jeder neuen Zeile explodieren soll, damit Zeile für Zeile in eine Datenbank eingetragen werden soll.

            • also genau das, was ich auch erwarten würde.

            wieso bei dir

            echo $eingabe_expl[$i];

            _nicht_ die werte dieser arrayelemente ausgeben sollte - absolut keine idee.

            du hast das aber schon 100%ig so da stehen?

            gruß,
            wahsaga

            --
            /voodoo.css:
            #GeorgeWBush { position:absolute; bottom:-6ft; }
            1. hi,

              puh - keine ahnung, was du da treibst :-)

              Ähm, also ich hab jetzt den Hinweis von Tom berücksichtigt, auch mal $eingabe durch $_POST['eingabe'] ersetzt und die noch überflüssige verbinden.php auskommentiert - und nun gehts.
              Nicht verstehend, warum damit jetzt das Problem behoben wurde, hab ichs Schritt für Schritt wieder rückgängig gemacht und jetzt geht auch die Ursprüngliche Form. *verwirrt bin*

              Ich hab nochmaln Screenshot von der Seite im Cache gemacht (siehe Grafik-URL)

              Na ja, da hat sich mein Problem quasi in Luft aufgelöst!
              Aber vielen Dank!

              Jörg

  2. Hello,

    for ($i=0; $i < count($arr); $i++) {
      echo $arr[$i];
    }

    Es mag nicht ganz falsch sein, aber es sit auch nicht ganz richtig, da PHP-"Arrays" keine geschlossenen Speicherstrukturen mit Derefenrenzierungs-Index sind, sondern verkettete Strukturen (Bäume) mit einem _Such_-"Index".

    Das bedeutet, dass bei jedem Zugriff die Kette von vorne durchlaufen werden muss um den Markierer (Namen / Index) auf dem Element mit dem Suchbegriff zu vergleichen. Wenn dieser in der kette nicht vorhanden ist, gibts einen Fehler. Um diesen Fehler zu vermeiden, muss man eigentlich vorher eine Abfrage durchführen:

    for ($i=0; $i < count($arr); $i++)
      {
        if (isset($arr[$i]))
        {
          echo $arr[$i];
        }
        else
        {
          ## Fehlerbehandlung
        }
      }

    Um diese beiden Maquos auszugleichen, gibt es bei PHP seit Version 4.?? die Spezialfunktion

    foreach($arr as $index => $element)
      {
        show($element);         # zum Anzeigen reicht die Kopie
        alter($arr($index));    # Zum Verändern muss man auf das Original zugreifen
      }

    Man kann diese Bearbeitung aber immer nur "vorne" beginnen, aber jederzeit abbrechen.
    Man muss sich keine Gedanken über die Länge (count()) der Kette machen, da PHP die selber kennt.
    Man muss sich keine Gedamken über nicht vorhandene Indexe machen, da die Kette nicht nach Index, sondern nach Verkettungsreferenzen abgearbeitet wird. Die kennt PHP ganz alleine.

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

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    1. Hallo Tom,

      alter($arr($index)); # Zum Verändern muss man auf das Original zugreifen

      unter php4, ja - unter php5 funktioniert aber auch:
      foreach($arr => &$element)
      (mal abgesehen davon, dass du an der stelle wohl alter($arr[$index]); gemeint hast :-))

      Grüße aus Nürnberg
      Tobias

      1. Hello,

        (mal abgesehen davon, dass du an der stelle wohl alter($arr[$index]); gemeint hast :-))

        jau, das ist richtig erkannt.
        Und das mit den Referenzen unter PHP5 funktioniert jetzt tatsächlich?
        Funktioniert das auch mit dem Key?
        Das hieße dann ja, dass man sich viel Speicherplatz spart und dadurch speicherkritische Anwendungen wieder etwas mehr Luft bekommen...

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

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
        1. Hallo Tom!

          (mal abgesehen davon, dass du an der stelle wohl alter($arr[$index]); gemeint hast :-))

          jau, das ist richtig erkannt.
          Und das mit den Referenzen unter PHP5 funktioniert jetzt tatsächlich?
          Funktioniert das auch mit dem Key?
          Das hieße dann ja, dass man sich viel Speicherplatz spart und dadurch speicherkritische Anwendungen wieder etwas mehr Luft bekommen...

          Klasse, mir ist das auch neu, aber es stimmt:

          | As of PHP 5, you can easily modify array's elements by preceding $value with &. This will assign reference instead of copying the value.
            http://php.net/foreach

          Bye,
          Peter

        2. echo $begrueszung;

          Und das mit den Referenzen unter PHP5 funktioniert jetzt tatsächlich?

          foreach($array as $key => &$value)

          ist die richtige Syntax, wobei das '$key =>' wie üblich fakultativ ist.

          Funktioniert das auch mit dem Key?

          Willst du den Key im laufenden Betrieb verändern? Da wäre ich an einem Anwendungsbeispiel oder besser einem konkreten Anwendungsfall interessiert.

          Was machst du, wenn du mit dem modifizierten Key einen existierenden triffst?
          Bevorzugst du da das array_merge() oder das $array1 + $array2 Verhalten?

          echo "$verabschiedung $name";

          1. Hello,

            Was machst du, wenn du mit dem modifizierten Key einen existierenden triffst?
            Bevorzugst du da das array_merge() oder das $array1 + $array2 Verhalten?

            Ich bin eigentlich erst durch den Hinweis auf die Referenzen auf die Idee gekommen, das mal auszuprobieren. So wirklich benutzt habe ich es noch nicht. Aber foreach() dürfte das ermöglichen, da der Key in dieser Schliefe kein Schleifenparamter ist, sondern nur ein Attribut des Elementes, genauso wie der Wert.

            Man müsste ihn also innerhalb der Schleife ändern können.
            Allerdings stellt PHP keine mir bekannnte Funktion dafür zur Verfügung.
            Man kann das Element nur entfernen oder eine Element, dass den Key trägt, verändern, aber nicht den Key des aktuellen Elementes ändern.

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

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau
            1. echo $begrueszung;

              Man müsste ihn [den Key] also innerhalb der Schleife ändern können.
              Allerdings stellt PHP keine mir bekannnte Funktion dafür zur Verfügung.

              Das geht ja aus gutem Grund nicht mal außerhalb von Schleifen. Auch array_change_key_case() zum ändern der Groß-/Klein-Schreibweise der Schlüssel gibt nur eine Kopie zurück. (Wenn doppelte Keys auftreten gewinnt der letzte.)

              Man kann das Element nur entfernen oder eine Element, dass den Key trägt, verändern, aber nicht den Key des aktuellen Elementes ändern.

                
              $array_keys = array_keys($array);  
              $array_keys[$position] = $somethingother;  
              $array = array_combine($array_keys, $array); // ab PHP 5  
              
              

              macht's auch nicht ohne umzukopieren...
              (Auch hier besiegt der letzte den ersten, wenn am Ende in $array_keys Werte doppelt vorhanden sind.)

              echo "$verabschiedung $name";

    2. hi Tom,

      Das bedeutet, dass bei jedem Zugriff die Kette von vorne durchlaufen werden muss um den Markierer (Namen / Index) auf dem Element mit dem Suchbegriff zu vergleichen. Wenn dieser in der kette nicht vorhanden ist, gibts einen Fehler.

      Wie soll's denn passieren, dass der Suchbegriff aus {$i|0<$i<count($arr)} nicht vorhanden ist? Und selbst wenn... bei echo $arr[2813771263]; passiert doch einfach gar nichts?

      Grüße
      Jörg

      1. Hello,

        Das bedeutet, dass bei jedem Zugriff die Kette von vorne durchlaufen werden muss um den Markierer (Namen / Index) auf dem Element mit dem Suchbegriff zu vergleichen. Wenn dieser in der kette nicht vorhanden ist, gibts einen Fehler.

        Wie soll's denn passieren, dass der Suchbegriff aus {$i|0<$i<count($arr)} nicht vorhanden ist? Und selbst wenn... bei echo $arr[2813771263]; passiert doch einfach gar nichts?

        Nein, es passiert nicht "gar nichts", sondern man greift dann auf einen nicht vorhandenen Index zu. Wenn Du nun die Notices (error_reporting = E_ALL) eingeschaltet hast, wirst Du auch gewarnt.

        Notices sind im Prinzip in PHP die wichtigsten Fehlermeldungen, da das Script trotz Notice weiterläuft und diese einen daher auf die Ursache von (vielleicht schweren) Folgefehlern aufmerksam machen. Bei fast allen anderen Fehlermeldungen wird abgebrochen. Es kann also nichts schlimmeres mehr passieren.

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

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
        1. Hallo Tom,

          der Hintergrund Jörgs Frage im Grundsätzlichen will auch mir nicht einleuchen. Hast Du ein reproduzierbares Beispiel, wo aus explode($a,$b); unter der Voraussetzung ((gettype($a)==gettype($b))=="string") kein "formschönes" Datenfeld entsteht?

          Gruß aus Berlin!
          eddi