Sven: Problem bei einfacher for-Schleife

Hallo ihr,

ich hab ein einfaches Problem mit einer for-Schleife, und zwar ist die Ausgabe nicht der Wert, der er sein sollte ;) Bestimmt hab ich was ganz einfaches übersehen oder durcheinander gebracht...

Folgender Beispielcode:

$text = "1+2+3";
$array = explode("+",$text);

for($anzahl = 1; $array[$anzahl-1] != NULL; $anzahl++);
  {
  echo $anzahl."<br>";
  }

Ich wollte mit dieser Schleife rausfinden, wieviele in meinem Array stehen. Es sind 3, wie man oben sehen kann. Wenn ich das Script ausführen lasse, zeigt mir $anzahl jedoch den Wert 4 an.

Nochmal logisch durchgehen: Die Variable $text wird an den + Zeichen aufgeteilt und das Array enthält somit 3 Werte. In der Schleife wird $anzahl auf 1 gesetzt. Dann wird abfragt, ob das Array überhaupt einen Wert enthält... angefangen wird mit $array[0] (halt $array[$anzahl-1]). Er stellt fest: Jo, das Array hat nen Wert... $anzahl um 1 erhöhen und die Schleife neu ausführen. Das macht er solange, bis er bei array[3] ankommt, $anzahl hat dann den Wert 4...

Ah und grad hats bei mir geklingelt ;) Natürlich zählt er bis 4 hoch, erst dann ist das Array leer und er steigt aus der Schleife aus.

Heisst das, ich muss am Ende einfach nur 1 von $anzahl abziehen, und das Verfahren ist in Ordnung? Oder ist das generell ein "schlechter Stil" den ich da angewandt habe?

Danke schonmal! (auch wenn sich mein Problem irgendwie grad von selbst erledigt hat... manchmal hilft es halt, die Schritte nochmal logisch nachzuvollziehen ;))

Sven

  1. Oh und nochwas. Mein Satz: "Ich wollte mit dieser Schleife rausfinden, wieviele in meinem Array stehen." sollte natürlich folgendermaßen heißen:

    "Ich wollte mit dieser Schleife rausfinden, wieviele Werte in meinem Array stehen."

    Und ich muss natürlich am Ende nicht 1 abziehen, sondern $anzahl am Anfang einfach nur auf 0 setzen, dann erspar ich mir das Problem ;)

    Bleibt nur die Frage nach dem Stil... umständlich, unkorrekt oder okay?

    Sven

    1. Hallo,

      "Ich wollte mit dieser Schleife rausfinden, wieviele Werte in meinem Array stehen."
      Bleibt nur die Frage nach dem Stil... umständlich, unkorrekt oder okay?

      http://www.php.net/manual/en/function.count.php

      viele Grüße

      Axel

      1. Hallo,

        Wo wir bei der Thematik sind: Ein Array kann ja durchaus "fragmentiert" sein, Ich definiere eines mit der Länge 1000, und belege dann, sagen wir, nur ein Element mit einem Wert, sagen wir Stelle 827.
        count() dürfte dann, wenn ich mich nicht irre, tausend ausgeben, was auch korrekt ist, denn das array enthält ja tausend Elemente. Ist halt nur eines (Nr.826) mit einem Wert ungleich NULL belegt.

        Gibt es in Php auch so etwas wie z.B. in Java, nämlich einfach einen Sammelbehälter, wo ich Variablen (Reihenfolge egal) reinstecken kann, und sicher sein kann, das ich, SOLANGE der Behälter gesetzte Variablen enthält, auch eine gesetzte Variable bei Abfrage geliefert bekomme und keine ungesetzte (Also so etwas wie ein Stack).
        Das läßt sich natürlich auch recht unkompliziert mit einem Array machen, indem ich einfach abfrage ob der Wert nicht NULL ist, aber vielleicht gibt es ja noch bessere (schnellere) Konstrukte?

        Ich hoffe ich konnte verständlich in meinen Laienworten erklären, wie ich es meine...

        Gruß, Nils

        1. Hallo,

          Wo wir bei der Thematik sind: Ein Array kann ja durchaus "fragmentiert" sein, Ich definiere eines mit der Länge 1000, und belege dann, sagen wir, nur ein Element mit einem Wert, sagen wir Stelle 827.
          count() dürfte dann, wenn ich mich nicht irre, tausend ausgeben, was auch korrekt ist, denn das array enthält ja tausend Elemente. Ist halt nur eines (Nr.826) mit einem Wert ungleich NULL belegt.

          Ja, das ist so.

          Gibt es in Php auch so etwas wie z.B. in Java, nämlich einfach einen Sammelbehälter, wo ich Variablen (Reihenfolge egal) reinstecken kann, und sicher sein kann, das ich, SOLANGE der Behälter gesetzte Variablen enthält, auch eine gesetzte Variable bei Abfrage geliefert bekomme und keine ungesetzte (Also so etwas wie ein Stack).

          Welches Java-Objekt hast Du da im Auge?

          Das läßt sich natürlich auch recht unkompliziert mit einem Array machen, indem ich einfach abfrage ob der Wert nicht NULL ist,

          Dafür nimmt man im PHP üblicherweise isset.

          viele Grüße

          Axel

          1. Hallo,

            Gibt es in Php auch so etwas wie z.B. in Java, nämlich einfach einen Sammelbehälter, wo ich Variablen (Reihenfolge egal) reinstecken kann, und sicher sein kann, das ich, SOLANGE der Behälter gesetzte Variablen enthält, auch eine gesetzte Variable bei Abfrage geliefert bekomme und keine ungesetzte (Also so etwas wie ein Stack).
            Welches Java-Objekt hast Du da im Auge?

            Wie ich gesagt habe zum Beispiel den Stack

            Viele Grüße, Nils

            1. Hallo,

              Gibt es in Php auch so etwas wie z.B. in Java, nämlich einfach einen Sammelbehälter, wo ich Variablen (Reihenfolge egal) reinstecken kann, und sicher sein kann, das ich, SOLANGE der Behälter gesetzte Variablen enthält, auch eine gesetzte Variable bei Abfrage geliefert bekomme und keine ungesetzte (Also so etwas wie ein Stack).
              Welches Java-Objekt hast Du da im Auge?
              Wie ich gesagt habe zum Beispiel den Stack

              Da kann man aber auch NULL reinSTACKen ;-)
              Beweis?

              import java.util.*;

              class stack {
               public static void main(String[] args) {
                  Stack st = new Stack();

              st.push("Hallo");
                  st.push(null);
                  st.push(new String("Welt"));
                  st.push(null);
                  st.push(new Integer(42));

              Object o = null;

              while (!st.empty()) {
                    o = st.pop();
                    System.out.println(o);
                  }
               }
              }

              Wenn Du beim push aufpasst, dass kein NULL reinkommt, kannst Du das mit PHP mit einem Array nachbauen.

              http://www.php.net/manual/en/function.array-push.php
              http://www.php.net/manual/en/function.array-pop.php

              viele Grüße

              Axel

        2. echo $begrüßung;

          Wo wir bei der Thematik sind: Ein Array kann ja durchaus "fragmentiert" sein, Ich definiere eines mit der Länge 1000, und belege dann, sagen wir, nur ein Element mit einem Wert, sagen wir Stelle 827.

          Das scheitert schon im Ansatz daran, dass man bei PHP-Arrays keine Länge definieren kann. PHP-Arrays sind, wie das Handbuch sagt, eine geordnete Abbildung von Werten zu Schlüsseln, oder mit anderen Worten: viele einzelne Variablen (auch unterschiedlichen Typs) unter einem Hut zusammengefasst. Ist ein Schlüssel nicht im Array enthalten, wird auch kein Platz dafür belegt.

          Dein einer Wert steht auch nicht "an Position 827" sondern hat einfach nur den Schlüssel 827. Erfolgt nun zum Beispiel noch ein Schreibzugriff auf den bisher nicht vorhandenen Schlüssel 42 wird ein neues Element an die "geordnete Abbildung von Werten auf Schlüsseln" angehängt, das den ebendiesen Schlüssel erhält.

          Nicht vorhandene Schlüssel auf null zu prüfen ist auch nicht richtig. PHP gibt zwar bei Lesezugriffen auf nicht vorhandene Variablen und Array-Elemente null zurück, jammert dabei aber leise vor sich hin. Gestattet man PHP das Ausgeben von Notizen, indem man das error_reporting aus E_ALL stellt, kann man ihm dabei zusehen.

          echo "$verabschiedung $name";