Andreas: neuen Array an mehrdimensionalen Array anfügen

Hallo!

Versuche inzwischen fast verzweifelt einen Array an einen bestehenden Mehrdimensionalen Array anzuhängen, Problem:
es wird immer ein und derselbe Array einfach überschrieben! Und zwar möchte ich einen mehrdimensionalen Array im Session-Array speichern. ich speichere den Array Warenkorb in der Session, in dem Array Warenkorb speichere ich wiederum jeweils einen Array pro Artikel. Jetzt will ich mit folgender Funktion einen neuen Artikel hinzufügen, aber leider überschreibe ich immer nun ein und denselben Artikel:

function neu($beschreibung,$preis) {

if (!$_SESSION["warenkorb"]){
      $warenkorb = array();}
  else {
      $warenkorb = $_SESSION["warenkorb"];
  }

$neuer_artikel = array ( 'Beschreibung' => $beschreibung,
    'Preis' => $preis,
    'Anzahl' => '1');

$warenkorb[] = $neuer_artikel;
  $_SESSION["warenkorb"] = $warenkorb;

}

echo var_dump($_SESSION["warenkorb"]); gibt mir folgendes aus:

array(1) { [0]=> array(3) { ["Beschreibung"]=> string(12) "Bohrmaschine" ["Preis"]=> string(3) "115" ["Anzahl"]=> string(1) "1" } }

Ich habe es auch mit array_push()  probiert - dasselbe.

Verstehe auch nicht, warum ich die obige if-Abfrage brauche, aber ohne (statt if-Abfrage nur: $warenkorb = $_SESSION["warenkorb"];) bekomme ich beim ersten Veruch einen Artikel anzuhängen folgendes Problem:

Warning: Cannot use a scalar value as an array in /kunden/knet-systems.de/webseite/test/klasse.php on line 22
object(warenkorb)(0) { }

Das steht in line 22: $warenkorb[] = $neuer_artikel;

Irgendwie werde ich mit Arrays noch nicht so richtig warm, ist Euch wahrscheinlich ganz klar was ich da falsch mache, ich bin aber irgendwie mit meinem Latein am Ende :-(

Viele Grüße
Andreas

  1. hallo nochmal!

    Habe jetzt noch ne ganze Menge getestst, habe ganz einfach angebfangen mit dem Code, habe eine Funktion drum herum gelegt, udn am Ende wieder die Klasse, und erst dann gabs Probleme!

    <?
    session_start();
    ##############################

    class wk{

    function neu ($beschreibung,$preis){

    $warenkorb = $_SESSION["warenkorb"];
        $neuer_artikel = array ( 'Beschreibung' => $beschreibung,
             'Preis' =>   $preis,
           'Anzahl' => '1');

    $warenkorb[] = $neuer_artikel;

    $_SESSION["warenkorb"] = $warenkorb;
       }
    }

    $warenkorb = new wk();
    $warenkorb -> neu("Toaster","121");

    ##############################
    echo var_dump($_SESSION);
    ?>

    Wenn ich die Klassse drum herum weglasse funktioniert es, mit Klasse steht da:

    Warning: Cannot use a scalar value as an array in /kunden/knet-systems.de/webseite/test/kl.php on line 16
    array(1) { ["warenkorb"]=> &object(wk)(0) { } }

    Versteht das jemand?

    Grüße
    Andreas

    1. Halihallo nochmals ;)

      Habe jetzt noch ne ganze Menge getestst, habe ganz einfach angebfangen mit dem Code, habe eine Funktion drum herum gelegt, udn am Ende wieder die Klasse, und erst dann gabs Probleme!

      function neu ($beschreibung,$preis){

      $warenkorb = $_SESSION["warenkorb"];
          $neuer_artikel = array ( 'Beschreibung' => $beschreibung,
               'Preis' =>   $preis,
             'Anzahl' => '1');

      $warenkorb[] = $neuer_artikel;

      $_SESSION["warenkorb"] = $warenkorb;
         }
      }

      Wenn ich die Klassse drum herum weglasse funktioniert es, mit Klasse steht da:

      Warning: Cannot use a scalar value as an array in /kunden/knet-systems.de/webseite/test/kl.php on line 16
      array(1) { ["warenkorb"]=> &object(wk)(0) { } }

      Hm. Hm. Hm. Mal überlegen... noch ne Sekunde, bitte... OK. Hab vielleicht eine Idee: benenn mal $warenkorb in $wk um (nur in der Funktion), oder definier die Variable $warenkorb in der Funktion als "lokal". Dann sollte es funktionieren. Ich vermute, dass der PHP Interpreter in der Funktion das $warenkorb als die Instanz von WK interpretiert => In der Session eine Instanz speichern??? - Macht wohl wenig Sinn => Fehler...

      Vielleicht liegt es daran... Versuch's einfach mal...

      Viele Grüsse

      Philipp

      1. Hallo!

        Hm. Hm. Hm. Mal überlegen... noch ne Sekunde, bitte... OK. Hab vielleicht eine Idee: benenn mal $warenkorb in $wk um (nur in der Funktion), oder definier die Variable $warenkorb in der Funktion als "lokal". Dann sollte es funktionieren. Ich vermute, dass der PHP Interpreter in der Funktion das $warenkorb als die Instanz von WK interpretiert => In der Session eine Instanz speichern??? - Macht wohl wenig Sinn => Fehler...

        Na, woher willst Du als PHP-nicht-Kenner das wissen? Das schlimmste - Du hattest Recht!!! Verstehe ich aber nicht!? Das eine ist die Variable in einer Methode der Klasse, das andere die Instanz der Klasse. Warum kann sich das überschneiden?

        Aber vielleicht hat ja jemand noch einen Tipp, wie ich diese blöde if-Abfrage loswerde:

        if(!$_SESSION["warenkorb"]){
              $warenkorb = array();
         }else{
              $warenkorb = $_SESSION["warenkorb"];}

        Denn sonst meckert er am Anfang immer, "das sei kein Array", an den ich da was anfügen will! Und die Steht auch noch in der Methode!
        Hat es eigentlich sinn, in der Klasse als erstes mal ein biosschen Code auszuführen, also direkt am Anfang den Warenkorb aus der Session in als eine Eigenschaft der Klasse zu initiieren?

        also was der Art

        class warenkorb{

        $korb = $_SESSION["warenkorb"];

        ...

        Was aber leider nicht funktioniert.

        Ich frage mich halt, ob ich es besser direkt mache, oder erst durch den Aufruf einer Methode aus dem eigentlichen Script, was für Modularität ja wieder nicht so toll wäre, oder?

        Viele Grüße
        Andreas

        1. Halihallo again ;)

          Hm. Hm. Hm. Mal überlegen... noch ne Sekunde, bitte... OK. Hab vielleicht eine Idee: benenn mal $warenkorb in $wk um (nur in der Funktion), oder definier die Variable $warenkorb in der Funktion als "lokal". Dann sollte es funktionieren. Ich vermute, dass der PHP Interpreter in der Funktion das $warenkorb als die Instanz von WK interpretiert => In der Session eine Instanz speichern??? - Macht wohl wenig Sinn => Fehler...

          Na, woher willst Du als PHP-nicht-Kenner das wissen?

          vielleicht hab ich ja heimlich gebüffelt ;-)
          Ne, aber mit der Zeit kriegt man so ein Gefühl ;-)

          Das schlimmste - Du hattest Recht!!! Verstehe ich aber nicht!? Das eine ist die Variable in einer Methode der Klasse, das andere die Instanz der Klasse. Warum kann sich das überschneiden?

          Eben weil du die Variablen nicht deklarierst. Der Interpreter sieht nur einen Namen, dann sucht er intern nach, ob die Variable bereits "vorhanden" ist. Ist dies der Fall, wird sie verwendet, ist dem aber nicht so, wird sie iniziiert. Da du den Namen bereits für die Instanz gesetzt hast (und in der Funktion den gleichen Namen hast), ist die Variable $warenkorb in der Funktion bereits definiert (was ohne Klasse ja nicht der Fall wäre) und dann entsteht der Fehler... Wenn du Klasse weglässt, ist die Variable noch nicht gesetzt und dann arbeitet dein Programm auch ganz wie erwartet...

          Kleiner Tipp: Wenn du Variablen/Arrays/what-ever in einer Funktion/Methode/Hauptprogi/... verwendest, setz das erstemal, wenn du sie verwendest ein 'var' davor. Das 'var' heisst: "Die Variable nur im momentanen Block definiert". Dann hast du das Problem nicht mehr, da bei jedem Funktionsaufruf dann eine "eigene, lokale" $warenkorb-Variable iniziiert wird.

          Aber vielleicht hat ja jemand noch einen Tipp, wie ich diese blöde if-Abfrage loswerde:

          if(!$_SESSION["warenkorb"]){
                $warenkorb = array();
          }else{
                $warenkorb = $_SESSION["warenkorb"];}

          Denn sonst meckert er am Anfang immer, "das sei kein Array", an den ich da was anfügen will! Und die Steht auch noch in der Methode!

          Hm. Füg doch einfach eine Methode in die Klasse ein:

          getWarenkorbArray oder so ähnlich. Diese rufst du dann ganz am Anfang auf und ebenso in der Funktion, dann hast du den Code nur einmal und sogar an der richtigen Stelle (in der Klasse, im Hauptprogi soll man sich nicht mit sowas quälen müssen).

          Hat es eigentlich sinn, in der Klasse als erstes mal ein biosschen Code auszuführen, also direkt am Anfang den Warenkorb aus der Session in als eine Eigenschaft der Klasse zu initiieren?

          Ich denke schon. Was stösst dich daran?

          class warenkorb{
          $korb = $_SESSION["warenkorb"];
          ...

          Was aber leider nicht funktioniert.

          Kannst du das noch etwas näher schildern? - Fehlermeldungen? - Oder gibt's dann die Eigenschaft $korb nicht? => this->korb!!!

          Ich frage mich halt, ob ich es besser direkt mache, oder erst durch den Aufruf einer Methode aus dem eigentlichen Script, was für Modularität ja wieder nicht so toll wäre, oder?

          Ja genau! - Alles was mit Warenkorb zusammenhängt, soll auch dort gecoded werden. Wenn du z. B. deine Warenkorb-Klasse einem anderen gibst, kennt der ja die Datenstrukturen von dir gar nicht (z. B. woher soll er wissen, dass du alles in Session speicherst?), dehalb soll auch alles, was damit zu tun hat in der Klasse stehen. Im Hauptprogramm soll man nur das "Interface" zur Klasse benutzen (der zweite Programmierer hat dann in seinem Programm gar nix von einer Session zu sehen gekriegt und soll das auch nicht).

          Viele Grüsse

          Philipp