Enrico: Kann Array nicht auf "leer" bzw. keinen Inhalt prüfen

Hallo,

Mist, ich stecke fest und habe mich zu früh gefreut.

Ich habe folgende Bildschirmausgabe über var_dump:

Array (2)
(
|    ['ID'] = String(32) "c2e3a24865035b4ee5f7272d30e13528"
|    ['Warenkorb'] => Array (0)
|    (
|    )
)

Dies bedeutet für mich, dass $_SESSION['Warenkorb'] als Array besteht, aber leer ist bzw. keinen Inhalt hat.

Beim Hinzufügen neuer Artikel prüfe ich, ob schon Inhalte hinterlegt sind oder nicht.

Wenn nicht, dann soll der String $Bestellposition dem Array $_SESSION['Warenkorb'] ohne weiteren Abgleich auf bereits vorhandene Artikel hinzugefügt werden.

Sind bereits Artikel vorhanden, dann erfolgt ein Abgleich, ob der hinzuzufügende Artikel bereits vorhanden ist und dann nur die Anzahl ($Spalte[3]) um Eins und die Gesamtsumme ($Spalte[5]) um den Einzelpreis ($Spalte[4]) erhöht.

Der zugehörige Code sieht folgendermaßen aus:

  
if (empty ($_SESSION['Warenkorb']))  
{  
   array_push ($_SESSION['Warenkorb'], $Bestellposition);  
}  
else  
{  
   for ($i = 0; $i < count ($_SESSION['Warenkorb']); $i++)  
   {  
      if (strpos ($_SESSION['Warenkorb'][$i], $Bezeichnung) !== false)  
      {  
         $ArtikelVorhanden = "ja";  
  
         $Spalte = explode ("|", $_SESSION['Warenkorb'][$i]); // Bezeichnung|Größe|Farbe|Anzahl|Einzelpreis|Summe  
  
         $Spalte[3] += 1;  
         $Spalte[5] += $Spalte[4];  
  
         $Bestellposition = implode ("|", $Spalte);  
  
         $_SESSION['Warenkorb'][$i] = $Bestellposition;  
  
         break;  
      }  
   }  
  
   if ($ArtikelVorhanden == "nein")  
   {  
      array_push ($_SESSION['Warenkorb'], $Bestellposition);  
   }  
}  

Aber ich komme nicht in den ersten Zweig meines Codes, der ja zutreffen müsste.

Schreibe ich nun if ($_SESSION['Warenkorb'][0] === "") anstatt if (empty ($_SESSION['Warenkorb'])), dann bekomme ich für diese Anweisung den Hinweis "Notice: Undefined offset: 0".

Wie muss ich das Konstrukt korrekt auf "Leere" bzw. keinen Inhalt prüfen?

Vielen Dank für eure Hilfe.

Gruß
Enrico

  1. Schreibe ich nun if ($_SESSION['Warenkorb'][0] === "") anstatt if (empty ($_SESSION['Warenkorb'])), dann bekomme ich für diese Anweisung den Hinweis "Notice: Undefined offset: 0".

    Probier mal die Funktion in_array()
    http://de1.php.net/manual/de/function.in-array.php

    Mfg

    1. Hallo,

      danke für Deine Antwort, aber diese Funktion bringt mir nur dann etwas, wenn ich weiß, wonach ich suche, aber hier weiß ich nicht, was ein Kunde in seinen Warenkorb ablegen will.

      Gruß
      Enrico

      1. Hi,

        danke für Deine Antwort, aber diese Funktion bringt mir nur dann etwas, wenn ich weiß, wonach ich suche, aber hier weiß ich nicht, was ein Kunde in seinen Warenkorb ablegen will.

        Warum legst du denn die Einträge in einem numerisch-indizierten Array an? Wäre eine Zuordnung von Artikelnr* zu Anzahl nicht einfacher? Denn dann bräuchtest du den Array nicht nach deinem Item absuchen, sondern einfach auf den Eintrag zugreifen.

        Wenn du über den Array iterieren willst, kannst du dann statt einer for-Schleife eine foreach-Schleife nutzen, welche IMHO einfacher zu lesen ist.

        * oder ein andersartiger eindeutiger Identifikator

        Bis die Tage,
        Matti

        1. Hallo Matti,

          Wäre eine Zuordnung von Artikelnr* zu Anzahl nicht einfacher?

          Was meinst Du genau damit bzw. wie würdest Du es konkret anders machen?

          Gruß,
          Enrico

          1. Hi,

            Wäre eine Zuordnung von Artikelnr* zu Anzahl nicht einfacher?

            Was meinst Du genau damit bzw. wie würdest Du es konkret anders machen?

            Dein Warenkorb besteht aus einer Menge an Bestellpositionen. Eine Bestellposition ist ein Artikelidentifikator (z.B. eine Artikelnummer) und die Anzahl der zu bestellenden Artikel.

            Wie beschrieben, wäre (wenn ich das nicht objektorientiert abbilden würde) mein Warenkorb ein Array. Die Indizes des Arrays wären die Artikelnummern, die Werte die Anzahl.

            Hinzufügen eines Artikels zum Warenkorb ist dann recht einfach. Sei $artikelNr die Artikelnummer, $anzahl die Anzahl des hinzuzufügenden Artikel.

            $warenkorb[$artikelNr] = isset($warenkorb[$artikelNr]) ? $anzahl : ($warenkorb[$artikelNr] + $anzahl);

            Das funktioniert, egal ob der Artikel bereits im Warenkorb enthalten ist oder nicht.

            Bis die Tage,
            Matti

  2. Lieber Enrico,

    warum willst Du nicht [link:http://de1.php.net/manual/de/function.count.php@title=count]($_SESSION['warenkorb']) verwenden?

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
    1. Hallo Felix,

      warum willst Du nicht [link:http://de1.php.net/manual/de/function.count.php@title=count]($_SESSION['warenkorb']) verwenden?

      Das habe ich jetzt auch verwendet und funktioniert einwandfrei und zuverlässig :-)

      Danke und Gruß
      Enrico

  3. Tach!

    if (empty ($_SESSION['Warenkorb']))
    {
       array_push ($_SESSION['Warenkorb'], $Bestellposition);
    }

    Soweit so richtig, aber nimm kein array_push(), wenn du nur einen Wert hinzuzufügen hast. Da ist die Zuweisung $array[] = wert; einfacher und spart auch einen Funktionsaufruf.

    for ($i = 0; $i < count ($_SESSION['Warenkorb']); $i++)

    Wenn du durch ein Array komplett durchlaufen möchtest, nimm bevorzugt foreach. Das notiert sich einfacher und man muss als Leser auch nicht nachvollziehen, ob du irgendeine Besonderheit beim Iterieren eingebaut hast (wie zum Beispiel Start an Position 1 statt 0).

    Aber ich komme nicht in den ersten Zweig meines Codes, der ja zutreffen müsste.

    Du hast das konkret wie überprüft? Man kann auch mit var_dump(empty ($_SESSION['Warenkorb'])) prüfen, ob empty() das erwartete Ergebnis liefert. Und der erste Zweig deines Codes ist der von mir oben zitierte?

    Schreibe ich nun if ($_SESSION['Warenkorb'][0] === "") anstatt if (empty ($_SESSION['Warenkorb'])),

    Wenn das Array leer ist, wieso probierst du dann mit einen Key (0) auf Elemente zuzugreifen?

    dann bekomme ich für diese Anweisung den Hinweis "Notice: Undefined offset: 0".

    Logisch.

    Wie muss ich das Konstrukt korrekt auf "Leere" bzw. keinen Inhalt prüfen?

    empty() ist schon richtig. Beachte aber die Sonderfälle, auch einige Werte werden von PHP als empty angesehen, zum Beispiel 0 und '0'.

    dedlfix.