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

  • DerDicke
    hat ein Thema erstellt Assoziatives Array: Werte ändern?.

    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.

  • Chriz
    antwortet
    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

    Einen Kommentar schreiben:


  • nikosch
    antwortet
    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.

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


  • DerDicke
    antwortet
    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

    Einen Kommentar schreiben:


  • Chriz
    antwortet
    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.

    Einen Kommentar schreiben:


  • nikosch
    antwortet
    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.

    Einen Kommentar schreiben:


  • DerDicke
    antwortet
    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.

    Einen Kommentar schreiben:


  • nikosch
    antwortet
    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);
      } 

    Einen Kommentar schreiben:


  • DerDicke
    antwortet
    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

    Einen Kommentar schreiben:


  • Chriz
    antwortet
    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.

    Einen Kommentar schreiben:


  • nikosch
    antwortet
    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.

    Einen Kommentar schreiben:


  • DerDicke
    antwortet
    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

    Einen Kommentar schreiben:


  • Chriz
    antwortet
    Damit bekomm ich aber später Probleme mit dem Template-Parser Smarty.
    Welche genau?

    Einen Kommentar schreiben:

Lädt...
X