Sascha: Array Problem

Hallo,

ich habe ein array Problem, oder sagen wir es mal so ich habe einen großen Fehler gemacht und zwar sollen im Array immer die neue Artikel-NR und Anzahl in die Session gespeichert werden.

Was ich so gelöst habe:

$_SESSION['warenkorb'][$art_nr] += $anzahl;

Das Problem ist wenn ich Artikelnummer 5000 übergeben bekomme, schreibt er mir ein Array mit 5000 Feldern bis 5000 sind alle Felder leer wenn er bei 5000 ankommt schreibt er in $art_nr die Anzahl der Artikel rein.

Wenn ich das so mache wird alles arg langsam :-( Da ich mit kleinen Zahlen gearbeitet habe, ist mir das zuerst nicht aufgefallen aber bei 6 stelligen Ziffern merkt man das schon...

Nur nun weiß ich nicht wie ich sonst beide Variablen in mein Warenkorb legen kann?

Muß ich nun ein 3 dimensionales array aufbauen oder wie verschachtel ich das array um damit am effizientesten arbeiten zu können.

Ich weiß ehrlich gesagt nun nicht wie ich am besten ansetzen soll, deswegen bitte ich um eure Hilfe!

Danke!

Gruß Sascha

  1. Hallo,

    ich habe ein array Problem, oder sagen wir es mal so ich habe einen großen Fehler gemacht und zwar sollen im Array immer die neue Artikel-NR und Anzahl in die Session gespeichert werden.

    Was ich so gelöst habe:

    $_SESSION['warenkorb'][$art_nr] += $anzahl;

    Das Problem ist wenn ich Artikelnummer 5000 übergeben bekomme, schreibt er mir ein Array mit 5000 Feldern bis 5000 sind alle Felder leer wenn er bei 5000 ankommt schreibt er in $art_nr die Anzahl der Artikel rein.

    Wenn ich das so mache wird alles arg langsam :-( Da ich mit kleinen Zahlen gearbeitet habe, ist mir das zuerst nicht aufgefallen aber bei 6 stelligen Ziffern merkt man das schon...

    Nur nun weiß ich nicht wie ich sonst beide Variablen in mein Warenkorb legen kann?

    Muß ich nun ein 3 dimensionales array aufbauen oder wie verschachtel ich das array um damit am effizientesten arbeiten zu können.

    Ich weiß ehrlich gesagt nun nicht wie ich am besten ansetzen soll, deswegen bitte ich um eure Hilfe!

    Danke!

    Gruß Sascha

    Hi,

    $tmpArt[0]=ArtNr
    $tmpArt[1]=Menge

    $Sesion['wk'][x]=$tmpArtikel

    oder

    $Sesion['wk'][x]=implode(char(9),$tmpArtikel) //sollte weniger Speicher brauchen

    und dann wieder mit explode zerlegen.

    Wobei x = Anzahl der Objekte im Wk ist. Kannst Du ja im $Sesion['wk'][0] ablegen.

    Gruss

    ThN

    1. $tmpArt[0]=ArtNr
      $tmpArt[1]=Menge

      $Sesion['wk'][x]=$tmpArtikel

      oder

      $Sesion['wk'][x]=implode(char(9),$tmpArtikel) //sollte weniger Speicher brauchen

      Wobei x = Anzahl der Objekte im Wk ist. Kannst Du ja im $Sesion['wk'][0] ablegen.

      Danke erstmal das bringt mich schon einmal wieder viel weiter!

      Was Du mit x genau meinst weiß ich nicht aber ich habe da keine Zahl eingetragen warum auch? Der zählt das array doch automatisch hoch.

      $Sesion['wk'][x]=implode(char(9),$tmpArtikel)

      Diese Zeile wird auch angemekert weil der Interpreter char(9) als Funktion anssieht. Du wolltest den Datentyp ändern aber char 9 wieviel Zeichen sind das denn?

      ich habe es nun so geschrieben:
      $Sesion['wk'][]=implode(","),$tmpArtikel)

      Für weitere gute Tipps bin ich immer dankbar!

      Gruß Sascha

      1. Hi,

        ließ dir lieber nochmal das Thema Arrays durch und versuche das zu verstehen:

        $fruits = array (
            "Früchte" => array ("a"=>"Orange", "b"=>"Banane", "c"=>"Apfel"),
            "Zahlen"  => array (1, 2, 3, 4, 5, 6),
            "Löcher"  => array ("erstes", 5 => "zweites", "drittes")
        );

        1. ja das habe ich bereits nur ich habe hier 2 mal ineinander verschachtelet arrays da sieht das schon wieder anders aus.

  2. Ich habe nun schon etwas vorgearbeitet aber nun weiß ich nicht mehr weiter wie ich mein verschachteltes Array wieder auslese?

    $nummer = array();
    $menge = array();
    $bestellung = array();

    $nummer["art_nr"] = $art_nr; // wird diesem Script übergeben
    $nummer["anzahl"] = $anzahl; // wird diesem Script übergeben

    $bestellung[] = $nummer;

    echo "<pre>";
    print_r($bestellung);
    echo "</pre>";

    if (!empty($anzahl))
      {
      $_SESSION['warenkorb'][] = $bestellung;
      }

    Ausgabe

    @$max=max(array_keys($_SESSION['warenkorb']));
    $max += 1;

    for ($i = 0; $i < $max; $i++ )
      {

    If (!empty ($_SESSION['warenkorb'][$i]))
        {

    echo "Art-Nr: ";  #### Aus $bestellung[] $art_nr auslesen
                      }
                    }

    Wie greife ich den auf das Array $bestellung[] wo $art_nr drin steht drauf zu? Genau diese Stelle ist mein Problem. Oder wie lasse ich mir das komplette Array anzeigen welches ich schon in mein $_SESSION['warenkorb'] geschrieben habe? Mit print_r(); kriege ich das nicht hin.

  3. Hallo!

    Was ich so gelöst habe:

    $_SESSION['warenkorb'][$art_nr] += $anzahl;

    Das Problem ist wenn ich Artikelnummer 5000 übergeben bekomme, schreibt er mir ein Array mit 5000 Feldern bis 5000 sind alle Felder leer wenn er bei 5000 ankommt schreibt er in $art_nr die Anzahl der Artikel rein.

    Eigentlich sollten keine 4999 Array-Elemente erstellt werden.

    // Beispiel

    $array['warenkorb'][5000] = 10;
    $array['warenkorb'][5000] += 10;

    Das Array sieht bei mir folgendermaßen aus.

    Array
    (
        [warenkorb] => Array
            (
                [5000] => 20
            )

    )

    MfG, André Laugks

    --
    L-Andre @ gmx.de
    1. Hallo!

      Was ich so gelöst habe:

      $_SESSION['warenkorb'][$art_nr] += $anzahl;

      Das Problem ist wenn ich Artikelnummer 5000 übergeben bekomme, schreibt er mir ein Array mit 5000 Feldern bis 5000 sind alle Felder leer wenn er bei 5000 ankommt schreibt er in $art_nr die Anzahl der Artikel rein.

      Eigentlich sollten keine 4999 Array-Elemente erstellt werden.

      // Beispiel

      $array['warenkorb'][5000] = 10;
      $array['warenkorb'][5000] += 10;

      Das Array sieht bei mir folgendermaßen aus.

      Array
      (
          [warenkorb] => Array
              (
                  [5000] => 20
              )

      )

      Also wenn ich es mit print_r($variable); ausgebe wird mir alles angezeigt

      Da ich mit 6 steilligen Artikelnummern arbeite wird das arg lahm... allein schon dann wenn ich nur den Wert ins array schreibe.

      verstehe ich auch nicht?

      1. Hallo!

        Also wenn ich es mit print_r($variable); ausgebe wird mir alles angezeigt

        Da ich mit 6 steilligen Artikelnummern arbeite wird das arg lahm... allein schon dann wenn ich nur den Wert ins array schreibe.

        Ich habe es mal mit einer Session probiert.

        session_start()

        $_SESSION['warenkorb'][5000] = 10;
        $_SESSION['warenkorb'][5000] += 10;

        echo count($_SESSION['warenkorb']);
        // Ausgabe
        1

        function printr($_var)
        {
         echo '<pre>';
         print_r($_var);
         echo '</pre>';
        }

        printr($_SESSION);
        // Ausgabe
        Array
        (
            [warenkorb] => Array
                (
                    [5000] => 20
                )

        )

        Ist vielleicht Dein Script fehlerhaft? Wo Du mit einer Schleife diese Anzahl an Elementen aufbaust?

        verstehe ich auch nicht?

        Ich auch nicht!

        MfG, André Laugks

        --
        L-Andre @ gmx.de
        1. Ist vielleicht Dein Script fehlerhaft? Wo Du mit einer Schleife diese Anzahl an Elementen aufbaust?

          Ja es liegt im Script wo ich mich als User angemeldet habe da durchlaufe ich mit der for Schleife alles durch.

          Ohne Login ist alles normal und richtig!

          Fällt mir nun auch erst im nachhinein ein :(

    2. Hallo,

      das was Du sagst Stimmt! Die 5000 ist im Prinzip nur ein Name wo drauf zugegriffen wird. Ich habe es wieder so hergestellt wie zuvor.

      Und muß festellen mein Fehler ist wo ganz anders. Und zwar als unregsitrierter User ist in meinem Shop alles so wie es sein muß aber sobald ich als User eingeloggt bin wird alles arsch lahm...

      Das ist mir zuvor nicht aufgefallen. Ich weiß nun auch wo der Fehler liegt. Dort lasse ich das Array mit einer for Schleife bis zur höchsten Artikelnummer durchlaufen... Kein wunder warum alles so arsch lahm ist ;-)

      Aber trotz alledem hatte ich hier von jemanden aussem Forum eine sehr gute Idee bekommen und zwar die Bestellung mit implode in string zu schreiben. Fraglich ist was zieht mehr Resourcen arbeiten mit dem Array oder mit der implode explode Methode?

      Ich bin mir auch nicht sicher ob es mit der implode explode Methode funktioniert das es sich dort doch um string handelt? Und mit einem Strink kann ich doch gar nicht rechnen? Oder wie ist das dort? Kann ich den Datentyp umwandeln? Wenn ja wie?

      Im Prinzip geht es mir nur darum die optimalste Lösung zufinden um so wenige Resourcen zu verschwenden wie es nur möglich ist!?

      Gruß Sascha

      Für Tipps bin ich immer dankbar!

      1. Hallo!

        Ich bin mir auch nicht sicher ob es mit der implode explode Methode funktioniert das es sich dort doch um string handelt? Und mit einem Strink kann ich doch gar nicht rechnen? Oder wie ist das dort? Kann ich den Datentyp umwandeln? Wenn ja wie?

        Implode/Explode..., Quatsch!

        Verwende ein gepflegtes Array, Du hast viel mehr Möglichkeiten, ist IMHO auch professioneller.

        MfG, André Laugks

        --
        L-Andre @ gmx.de
        1. Hallo!

          Ich bin mir auch nicht sicher ob es mit der implode explode Methode funktioniert das es sich dort doch um string handelt? Und mit einem Strink kann ich doch gar nicht rechnen? Oder wie ist das dort? Kann ich den Datentyp umwandeln? Wenn ja wie?

          Implode/Explode..., Quatsch!

          Verwende ein gepflegtes Array, Du hast viel mehr Möglichkeiten, ist IMHO auch professioneller.

          Und wie durchlaufe ich dort am besten das array wenn ich keine for Schleife nehmen darf? Wenn der User eingellogt ist muß ich alle Felder durchgehen. Nur welche Lösungen gibt es denn da noch?

          In meinem Shop können angemeldete Kunden ihr eigenes Warensortiment erstellen und bei jedem Login wird nur das eigenen Warensortiment angezeigt.

          Ich habe das bisher so gelöst das in der Tabelle Kunden ein Feld welches Kunde_Artikel heißt. Und in dem Feld stehen alle Artikelnummer die ausgewählt wurden. Also die Artikel-Nr habe ich jeweils mit ; getrennt.

          Oder kann man das noch besser lösen? Es darf auch nicht zuviel Resourcen fressen.

          Gruß Sascha

          1. Hallo!

            Und wie durchlaufe ich dort am besten das array wenn ich keine for Schleife nehmen darf? Wenn der User eingellogt ist muß ich alle Felder durchgehen. Nur welche Lösungen gibt es denn da noch?

            Es ist ein assoziatives Array. Die durchläuft man am besten/i.d.R mit einer while-Schleife.

            $_SESSION['warenkorb'][21548] = 20;
            $_SESSION['warenkorb'][12874589] = 2;

            while(list($produkt_id, $menge) = each($_SESSION['warenkorb']))
             {
              echo "Produkt-ID: " . $produkt_id . " / Menge: " . $menge . "<br>";
             }

            Ich habe das bisher so gelöst das in der Tabelle Kunden ein Feld welches Kunde_Artikel heißt. Und in dem Feld stehen alle Artikelnummer die ausgewählt wurden. Also die Artikel-Nr habe ich jeweils mit ; getrennt.

            rrrhhhhhhhh! Ganz schlecht!

            // Tabelle: Kunde

            kun_id    benutzername    passwort
            1             otto           abc
            2             lisa           efg

            // Tabelle: Produkte

            pro_id     artikel_nr      produkt
            1             6587       Sony DVD-123
            2             897542     Sony MiniDisc Super
            3             54795412   Technics CD-Player 5

            // Tabelle: warenkorb
            war_id    kun_id      pro_id
            1            1          1
            2            1          3
            3            2          1

            MfG, André Laugks

            --
            L-Andre @ gmx.de
            1. Es ist ein assoziatives Array. Die durchläuft man am besten/i.d.R mit einer while-Schleife.

              $_SESSION['warenkorb'][21548] = 20;
              $_SESSION['warenkorb'][12874589] = 2;

              while(list($produkt_id, $menge) = each($_SESSION['warenkorb']))
               {
                echo "Produkt-ID: " . $produkt_id . " / Menge: " . $menge . "<br>";
               }

              Ich hatte das nun so gelöst ist die Variante langsamer als Deine Lösung?

              @$max=max(array_keys($_SESSION['warenkorb']));
              $max += 1;

              echo "$max: ".$max."<br>";

              for ($i = 0; $i < $max; $i++ )
                {

              If (empty ($_SESSION['warenkorb'][$i]))
                 {

              ...

              }
                }

              Ich habe das bisher so gelöst das in der Tabelle Kunden ein Feld welches Kunde_Artikel heißt. Und in dem Feld stehen alle Artikelnummer die ausgewählt wurden. Also die Artikel-Nr habe ich jeweils mit ; getrennt.

              rrrhhhhhhhh! Ganz schlecht!

              // Tabelle: Kunde

              kun_id    benutzername    passwort
              1             otto           abc
              2             lisa           efg

              // Tabelle: Produkte

              pro_id     artikel_nr      produkt
              1             6587       Sony DVD-123
              2             897542     Sony MiniDisc Super
              3             54795412   Technics CD-Player 5

              // Tabelle: warenkorb
              war_id    kun_id      pro_id
              1            1          1
              2            1          3
              3            2          1

              Nee Du hast da was falsch verstanden ich meine nicht die Warenkorb Funktion sondern der Kunde kann sich vom ganzen Shop ein eigenes Warensortiment zusammen stellen. So als ob jeder Kunde ein eigenen Shop hat aber dann nur mit dem Waren die der Kunde einmal zusammengestellt hat. Beispiel der Kindergarten stellt sich sein Warensortiment nur aus Säfte und Süssigkeiten zusammen. Und da habe ich die jeweiligen Art-Nr ein Feld mit ; getrennt geschrieben.

              Gruß Sascha