droom: Session Element löschen

Ich habe meine Session so:
if (!session_is_registered('cart')) {
 session_register('cart');
 $_SESSION['cart'] = array();
}

dann füge ich in dieser Session ein artikel zb mit id=4:

if($saction == "ses"){
        //habe ich diesen artikel schon eingefügt?
 for($i=0;$i<count($_SESSION['cart']);$i++){
   if ($_SESSION['cart'][$i] == '4'){$alreadyadd=true;}
 }
 if(!$alreadyadd) {$_SESSION['cart'][] ='4';}
  }

Funktionniert alles ganz gut. Nun möchte ich auch Elemente dieser Session löschen können. Wenn ich den Artikel 4 löschen möchte, habe ich es so versucht:
$_SESSION['cart'][4] ="";
und
unset($_SESSION['cart'][4]);

Beide methode funktionnieren nicht. Was mache ich da falsch

  1. Sup!

    Funktionniert alles ganz gut. Nun möchte ich auch Elemente dieser Session löschen können. Wenn ich den Artikel 4 löschen möchte, habe ich es so versucht:
    $_SESSION['cart'][4] ="";
    und
    unset($_SESSION['cart'][4]);

    Im Array an Position 4 muss sich nicht unbedingt der Artikel "4" befinden, besonders, wenn es der einzige Artikel ist.
    Das würde vielleicht mit einem assoziativen Array ("Hash") gehen, aber $_SESSION['cart'][] scheint kein assoziativer Array zu sein.
    $_SESSION['cart'] ist anscheinend einer.

    Gruesse,

    Bio

    --
    Never give up, never surrender!!!
    1. Danke Bio für den Hinweis. War ja ein Denkfehler, so funktionnierts nun, um den artikel zu löschen:

      for($i=0;$i<count($_SESSION['cart']);$i++){
       if ($_SESSION['cart'][$i]== 4) {
         unset($_SESSION['cart'][$i]);
       }
      }

      1. Hello,

        Danke Bio für den Hinweis. War ja ein Denkfehler, so funktionnierts nun, um den artikel zu löschen:

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

        {

        if ($_SESSION['cart'][$i]== 4)

        {

        unset($_SESSION['cart'][$i]);
          }
        }

        Das ist aber immer noch falsch.

        Angenommen, du hat bereits 20 Artikel drin.
        Dann lösch mit dieser Methode mal den vierten
        und dann lösche später noch den 17ten Artikel.

        Die For-Schliefe ist hier bereits seit über drei (vier?) Jahren als fehlerträchtig überholt. Es gibt dafür eigene Funktionen von PHP.

        http://de.php.net/manual/en/function.array-search.php
        und weitere

        Harzliche Grüße vom Berg
        http://bergpost.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
        Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

        1. Hast Recht Tom. Es passt noch nicht.

          Ich habe in einem array folgendes:

          $_SESSION['cart'][0]="Erst";
          $_SESSION['cart'][1]="Zweite";
          $_SESSION['cart'][2]="Dritte";
          $_SESSION['cart'][3]="Vierte";

          Wie kann ich $_SESSION['cart'][1] löschen ohne das es Probleme gibt?

          wenn unset($_SESSION['cart'][1]); mache, dann kennt er nicht mehr $_SESSION['cart'][2] und $_SESSION['cart'][3]. Sehr wahrscheinlich, weil meine Struktur dann folgendermassen ist:

          $_SESSION['cart'][0]="Erst";
          $_SESSION['cart'][2]="Dritte";
          $_SESSION['cart'][3]="Vierte";

          Wie kann ich also gezielt ein Element löschen, wenn ich sein Value weiss.

          1. Hello,

            Hast Recht Tom. Es passt noch nicht.

            Ich habe in einem array folgendes:

            $_SESSION['cart'][0]="Erst";
            $_SESSION['cart'][1]="Zweite";
            $_SESSION['cart'][2]="Dritte";
            $_SESSION['cart'][3]="Vierte";

            Wie kann ich $_SESSION['cart'][1] löschen ohne das es Probleme gibt?

            wenn unset($_SESSION['cart'][1]); mache, dann kennt er nicht mehr $_SESSION['cart'][2] und $_SESSION['cart'][3]. Sehr wahrscheinlich, weil meine Struktur dann folgendermassen ist:

            $_SESSION['cart'][0]="Erst";
            $_SESSION['cart'][2]="Dritte";
            $_SESSION['cart'][3]="Vierte";

            Wie kann ich also gezielt ein Element löschen, wenn ich sein Value weiss.

            Doch, mit unset($_SESSION['cart'][1])  kannst Du das Element mit dem Index [1] löschen.
            Aber für die Anzeige und Verarbeitung solltest Du nicht länger for() benutzen, sondern die für PHP-Arrays vorgesehen Funktion forech()
            http://de3.php.net/manual/en/control-structures.foreach.php
            Die durchläuft jeweils eine Liste (Dimension) des Arrays.

            Harzliche Grüße vom Berg
            http://bergpost.annerschbarrich.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau
            Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

          2. Hallo droom,

            wenn unset($_SESSION['cart'][1]); mache, dann kennt er nicht mehr $_SESSION['cart'][2] und $_SESSION['cart'][3]. Sehr wahrscheinlich, weil meine Struktur dann folgendermassen ist:

            Mit wahrscheinlich brauchst du dich in solchen Fällen nicht zufrieden zu geben: var_dump().

            Wie kann ich also gezielt ein Element löschen, wenn ich sein Value weiss.

            Tom hat dich doch schon auf array_search() verwiesen:

            if (in_array('Zweite', $_SESSION['cart'])) {  
                unset($_SESSION['cart'][array_search('Zweite', $_SESSION['cart'])]);  
            }
            

            Schöne Grüße,

            Johannes

  2. Hello,

    if (!session_is_registered('cart'))

    if (isset($_SESSION['cart']))

    Du bringst da zwei verschiedene PHP-Versionen durcheinander.
    Die Funktionen und Vorgehensweisen hatten zwar noch nebeneinander Existenzberechtigung, von einer Vermischung wurde aber ausdrücklich gewarnt.

    Von einem vermeintlich objektorientierten Ansatz mit session_is_registered() & Co. ist man schnell wieder abgekommen, da die Sprache einfach bleiben sollte.

    Es wurden stattdessen die "superglobalen" Arrays eingeführt, die im ganzen Script in allen Scopes (es gibt ja nur zwei Schichten) zur Verfügung stehen. Du kannst also _nach_ der Initialisierung der Session überall auf die Elemente des Arrays $_SESSION[] zugreifen, sie ändern, Elemente hinzufügen oder löschen...

    Harzliche Grüße vom Berg
    http://bergpost.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)