Ankündigung

Einklappen
Keine Ankündigung bisher.

Assoziatives Array: Werte ändern?

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Assoziatives Array: Werte ändern?

    Hi.
    Haut mich bitte nicht, aber ich finde einfach keinen Weg, werte in einem assoziativen Array zu ändern. Wie geht denn das?

    Problem:
    Ich erstelle einen kleinen Webshop. Dort brauch ich mein Cart das alle Items fasst, welche der User in seiner Session kauft. Sollte soweit klar sein (:.
    Bisher speicher ich diesen Wert so:
    Code:
    $cart[$itemid] += $count // etwas vereinfacht
    Damit bekomm ich aber später Probleme mit dem Template-Parser Smarty. Der verkraftet solche Arrays nicht oder ich bin dumm .
    Naja anyway, mit wär nen assoz. Array eh lieber.
    Also bitte ich euch hier um Hilfe einem alten Mann das mal zu erklären .
    lg

    ps.: Ich kann C++ und lerne gerade Php mit Learning by doing . Ich verwende für dieses Projekt CodeIgniter und Smarty Template Parser.

  • #2
    Damit bekomm ich aber später Probleme mit dem Template-Parser Smarty.
    Welche genau?
    "[URL="http://www.youtube.com/watch?v=yMAa_t9k2VA&feature=youtu.be&t=25s"]Mein Name ist Lohse, ich kaufe hier ein.[/URL]"

    Kommentar


    • #3
      Ich kann die Werte nicht ausgeben.

      Code:
      <!-- Cart Display -->
      <center><table border="{$border}">
      <tr><td colspan="2">Cart Content</td></tr>
      {section name=cartitems loop=$cart}
      <tr>
      <td>Item-ID: {}</td>
      <td>Count: {$cart[602]}</td>
      </tr>
      {/section}
      </table></center>
      <!-- End Cart Display -->
      Das Problem ist $cart[602]. Es funktioniert nur so, die Anzahl der Items an Index 602 abzufragen. Und das wäre ja statisch. Das is nicht was ich will.
      Deswegen möchte ich ein assoziatives Array . Um die vorhandenen Indexe abzufragen, habe ich keine Möglichkeit im Handbuch von Smarty gefunden.
      lg

      Kommentar


      • #4
        Du hast kein konkretes Problem benannt.
        Assoz. Arrays werden normal über ihren Schlüssel angesprochen

        PHP-Code:
        $aArray['key'] = 5;
        $aArray['key'] += 12;

        $aArray['key2'] = 'Horst';
        $aArray['key2'] =  'Herr ' $aArray['key2']; 
        Um die vorhandenen Indexe abzufragen, habe ich keine Möglichkeit im Handbuch von Smarty gefunden.
        Schau Dir mal foreach, key, array_keys, array_values an.
        [COLOR="#F5F5FF"]--[/COLOR]
        [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
        [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
        [COLOR="#F5F5FF"]
        --[/COLOR]

        Kommentar


        • #5
          Du verwendest numerische, nicht assoziative Schluessel, was schnell mal gefaehrlich enden kann wenn du array-Funktionen verwendest, die dir dann die Schluessel zuruecksetzen.

          Ich speicher im Warenkorb ein Cart_Article Objekt, das die Quanity-Eigenschaft kennt. So ist der Schluessel unwichtig.
          "[URL="http://www.youtube.com/watch?v=yMAa_t9k2VA&feature=youtu.be&t=25s"]Mein Name ist Lohse, ich kaufe hier ein.[/URL]"

          Kommentar


          • #6
            Ok, neuer Anlauf . Sorry, mir raucht grade der Kopf und ich finds schwer das zu erklären .
            Also bisher diese Lösung:
            Code:
            $cartarray[$itemid] += $count;
            Sollte soweit klar sein oder?

            Ich würde gerne:
            Code:
            $cartarray = array('id' => $itemid, 'count' => $count);
            verwenden.
            Soweit kein Problem.
            Nur jetzt würde ich gerne, wenn id schon existiert, nur count ändern.
            Das ist mein eigentliches Problem momentan.
            Hoffe das kam jetzt klarer rüber .... Sorry für die Verwirrung .

            Dann kann ich im Template das so ansprechen:
            Code:
            {section name=cartitems loop=$cart}
            ID: {$cartitems[cart].id} 
            Count: {$cartitems[cart].name}
            {/section}
            lg

            Kommentar


            • #7
              Meinst Du nen mehrdimensionalen Zugriff wie:

              PHP-Code:
              $cartarray[$itemid]['count'] += $count
              PHP-Code:
              if (array_key_exists ($itemid $cartarray)) {
                
              $cartarray[$itemid]['count'] = empty ($cartarray[$itemid]['count'])
                                                  ? 
              $count
                                                  
              $cartarray[$itemid]['count'] + $count;
                }
              else {
                
              $cartarray[$itemid] = array ('id' => $itemid 'count' => 1);
                } 
              [COLOR="#F5F5FF"]--[/COLOR]
              [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
              „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
              [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
              [COLOR="#F5F5FF"]
              --[/COLOR]

              Kommentar


              • #8
                Macht es mir doch büdde net so schwer
                Ich hab doch oben geschrieben:
                $cart = array('id' => $itemid, 'count' => $count);

                Das wird halt jedesmal angehängt.
                Nur möchte ich keine doppelten Einträge.
                Als Beispiel mit dem Wert 602:
                Code:
                $temp = array('itemid' = 602, 'count' => 5);
                array_push($cart, $temp);
                So, jetzt hab ich 5x die ID 602 im Warenkorb. Nur muss es auch möglich sein, danach noch welche mit 602 hinzuzufügen... und dafür fehlt mir gerade der Faden.
                Ich brauch quasi auf das "innere" Array mit id 602 ne Referenz die ich ändern kann.

                Kommentar


                • #9
                  Oh sorry. Aber so falsch ist das gar nicht. Benutz einfach die ID auch für das $cart Array als Schlüssel. Mit array_push funktionierts dann natürlich nicht mehr.

                  PHP-Code:
                  $temp = array ('itemid' 602'count' => 5);
                  cart_push($cart$temp);

                  function 
                  cart_push (& $cart$temp)
                    {
                    
                  $id $temp['itemid'];
                    if (
                  array_key_exists ($id $cart)) {
                        
                  $cart[$id]['count'] += $temp['count'];
                      }
                    else {
                        
                  $cart[$id] = $temp;
                      }
                    } 
                  Die bessere Variante wäre ein Cart Objekt anzulegen und Elemente über sauber defininierte Methoden hinzuzufügen.
                  [COLOR="#F5F5FF"]--[/COLOR]
                  [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
                  „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                  [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
                  [COLOR="#F5F5FF"]
                  --[/COLOR]

                  Kommentar


                  • #10
                    Der Array-Aufbau und die gesamte Warenkorbabwicklung ist schlecht.

                    Zum Array:
                    Ein Array-Schluessel impliziert ja schon, dass du dafuer einen eindeutigen Schluessel - also die Artikel-ID - verwenden solltest und keinen fortlaufenden Index. Sonst musst du ja jedes mal das richtige Element in deinem Warenkorb-Array suchen.

                    Zum Warenkorb an sich:
                    In PHP gibt es seit PHP 4 Klassen. Ein Warenkorb ist ein optimaler Kandidat fuer eine Klasse:
                    PHP-Code:
                    <?php
                    class Cart {
                      protected static 
                    $instance;
                      protected 
                    $articles = array();
                      protected function 
                    __construct() {}
                      public static function 
                    getInstance() {
                        if (
                    is_null(self::$instance)) {
                          
                    self::$instance = new self();
                        }
                        return 
                    self::$instance;
                      }
                      public function 
                    addArticle($id$amount 1) {
                        if (!
                    array_key_exists($id$this->articles)) {
                          
                    $this->articles[$id] = 0;
                        }
                        
                    $this->articles[$id] += $amount;
                        
                    $this->clean($idtrue);
                      }
                      public function 
                    removeArticle($id) {
                        
                    $this->clean($idfalse);
                      }
                      protected function 
                    clean($id$checkAmount) {
                        if (!
                    $checkAmount)) {
                          
                    $this->articles[$id] = 0;
                        }
                        if (
                    $this->articles[$id] < 1) {
                          unset(
                    $this->articles[$id]);
                        }
                      }
                    }
                    ?>
                    PHP-Code:
                    <?php
                    $cart 
                    Cart::getInstance();
                    $cart->addArticle(5); // article-id = 5
                    $cart->addArticle(62); // article-id = 6, menge = 2
                    $cart->removeArticle(5); // article-id = 5 doch nicht, rausnehmen
                    ?>
                    Das ist leicht verstaendlich und auch relativ leicht anzupassen. Und du musst dich selbst nicht mehr mit dem Array rumschlagen, der die Informationen enthaelt. Wenn du statt der $id jetzt ein Cart_Article-Objekt uebergibst, kann der Warenkorb sogar ohne Kenntnisse ueber die Artikelpreise selbst, den Warenkorb-Preis ausgeben:
                    PHP-Code:
                    <?php
                    public function getPrice($blnAsFloat false) {
                      
                    $price 0.0;
                      foreach (
                    $this->articles as $id => $article) { // $article sei ein Cart_Article-Objekt
                        
                    $price += $article->GetAmount() * $article->GetPrice();
                      }
                      return 
                    $blnAsFloat $price sprintf("EUR %s"number_format($price2));

                    ?>
                    Das ganze abstrahiert dir die Schwierigkeiten und Fehlerquellen ziemlich erfolgreich weg. Und du musst zugeben, mit ziemlich wenig Code.
                    "[URL="http://www.youtube.com/watch?v=yMAa_t9k2VA&feature=youtu.be&t=25s"]Mein Name ist Lohse, ich kaufe hier ein.[/URL]"

                    Kommentar


                    • #11
                      Vielen Lieben Dank!
                      Das hilft mir weiter.
                      Interessant zu sehen, dass es mittlerweile auch das Singleton-Pattern für Php gibt . Kannte ich bisher nur aus C++.
                      Aber ne Frage dazu: Das Objekt lebt doch nur einen Seitenaufbau lang oder?
                      Warum dann ein Singleton?
                      lg

                      Kommentar


                      • #12
                        Damit bei einem Aufruf nicht mehrere Objekte der gleichen Klasse erstellt werden und es unter Umständen zu Datenredundanz kommt.

                        Kommentar


                        • #13
                          Zudem bietet es eine einfache Möglichkeit, eine Objektinstanz unabhängig von bereits erfolgter Instanziierung aus jedem Scope, also bspw. auch aus einer Funktion anzufordern. Nicht mal eine Prüfung auf ein bereits erstelltes Objekt ist dabei notwendig.
                          Singletons haben aus diesem Grund den Ruf weg, oft als Variante zu globalen Variablen benutzt zu werden. Im konkreten Fall ist es imho trotzdem sinnvoll.
                          [COLOR="#F5F5FF"]--[/COLOR]
                          [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
                          „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                          [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
                          [COLOR="#F5F5FF"]
                          --[/COLOR]

                          Kommentar


                          • #14
                            Zitat von DerDicke Beitrag anzeigen
                            Vielen Lieben Dank!
                            Das hilft mir weiter.
                            Interessant zu sehen, dass es mittlerweile auch das Singleton-Pattern für Php gibt . Kannte ich bisher nur aus C++.
                            Gibts sogar in JavaScript:
                            Code:
                            MyObj = new function() {
                            }
                            Aber ne Frage dazu: Das Objekt lebt doch nur einen Seitenaufbau lang oder?
                            Warum dann ein Singleton?
                            lg
                            Singleton setzt du ja ein, um zu verhindern, dass es mehr als eine Instanz der Klasse zur Skriptlaufzeit gibt. Mehr als ein Warenkorb pro Kunde macht keinen Sinn. Natuerlich musst du den Zustand des Warenkorbs in der Session oder der Datenbank zwischenspeichern, da die Information bei Skripteende verworfen wird. Das koenntest du zum Beispiel im Destruktor des Cart festlegen, dann vergisst du es auch nicht
                            "[URL="http://www.youtube.com/watch?v=yMAa_t9k2VA&feature=youtu.be&t=25s"]Mein Name ist Lohse, ich kaufe hier ein.[/URL]"

                            Kommentar

                            Lädt...
                            X