HeikoH: mit unset() Array Element löschen

Hallo an Alle,

ich versuche mit unset() Array Element zu löschen, aber wie bei
http://de.php.net/manual/de/function.unset.php angegeben funktioniert es nicht, den Wert zu löschen.
Mein Beispielcode:

<html>
<head>
<?php
session_start();
//Vergleichsliste bearbeiten
if (isset($vergleich)) {
 if (isset($vergleichprodukt)) {
  array_push($vergleichprodukt,$vergleich);
 }
 else {
  $vergleichprodukt = array($vergleich);
  session_register("vergleichprodukt");
 }
}
if (isset($del_vergleich)) {
  unset($vergleichprodukt['$del_vergleich']);
}
?>
</head>

<body>
<?php if (isset($vergleichprodukt) AND in_array(0,$vergleichprodukt)) { ?>
<a href="<?php echo $PHP_SELF."?del_vergleich=wert1"; ?>">aus Liste l&ouml;schen</a>
<?php }
else { ?>
<a href="<?php echo $PHP_SELF."?vergleich=wert1"; ?>">wert1</a>
<?php } ?>
<br>
<?php if (isset($vergleichprodukt) AND in_array("wert2",$vergleichprodukt)) { ?>
<a href="<?php echo $PHP_SELF."?del_vergleich=wert2"; ?>">aus Liste l&ouml;schen</a>
<?php }
else { ?>
<a href="<?php echo $PHP_SELF."?vergleich=wert2"; ?>">wert2</a>
<?php } ?>
<br>
<?php if (isset($vergleichprodukt) AND in_array("wert3",$vergleichprodukt)) { ?>
<a href="<?php echo $PHP_SELF."?del_vergleich=wert3"; ?>">aus Liste l&ouml;schen</a>
<?php }
else { ?>
<a href="<?php echo $PHP_SELF."?vergleich=wert3"; ?>">wert3</a>
<?php } ?>
<br>
<a href="<?php echo $PHP_SELF; ?>">main</a>
<br>
<table width="50" border="1">
<?php
if(isset($vergleichprodukt)){
foreach($vergleichprodukt as $name => $wert) { ?>
 <tr>
  <td><?php echo $name; ?></td>
  <td><?php echo $wert; ?></td>
 </tr>
<?php }
}
else { ?>
  <tr>
    <td>Leer</td>
  </tr>
<?php } ?>
</table>
</body>
</html>

Wenn ich mit index(?), sprich Zahlen, arbeite, funktioniert es auch nicht perfekt, manchmal kommt es zu einem Durcheiander und falsche Werte werden gelöscht.
Es ist nicht nachvollziehbar wie es passiert, sonst könnte ich Euch mehr zu sagen.
Auch die Suche hier bringt nichts nachvollziehbares, aber eine Frage schon.
Mit foreach() soll es funktionieren, bedeutet es damit jedesmal nach unset() ein neues Array aufzubauen?
Egal, ich schweife ab, ich brauche einfach Hilfe beim Array Element löschen.
Kann mir jemand bei meinem Code die Fehler aufzeigen?

Ich danke Euch!

HeikoH

  1. Huhu Heiko

    hui, das sieht nach einer schweren Pehaperitis aus.
    Als Gegenmittel würde ich da eine Mixtur aus Superalis Globalus,
    Arreius Elementus und Hereus Docus [1] empfehlen.
    Wie lange bist Du denn noch wach?

    Viele Grüße

    lulu

    [1] die Lateiner mögen mir verzeihen, ich musste mich halt mit "la famille Leroc" rumschlagen während alle anderen blutrünstige Helden- und Schlachtengeschichten übersetzen durften.

    --
    bythewaythewebsuxgoofflineandenjoytheday
    1. Huhu Heiko

      HuHu LuLu

      hui, das sieht nach einer schweren Pehaperitis aus.

      nach WAS???

      Als Gegenmittel würde ich da eine Mixtur aus Superalis Globalus,
      Arreius Elementus und Hereus Docus [1] empfehlen.

      OhHa!

      Wie lange bist Du denn noch wach?

      Noch lange (schaut so aus)

      Viele Grüße

      ...auch von mir

      lulu

      HeikoH

      [1] die Lateiner mögen mir verzeihen, ich musste mich halt mit "la famille Leroc" rumschlagen während alle anderen blutrünstige Helden- und Schlachtengeschichten übersetzen durften.

      ...was auch immer das auch ist...

      1. Hallo Heiko

        Wie lange bist Du denn noch wach?
        Noch lange (schaut so aus)

        Fein.

        Also erstmal würde ich Dir empfehlen Dein Skript etwas übersichtlicher
        aufzubauen.
        Die Programmlogik oder Verarbeitung der Daten an den Anfang, das HTML
        an das Ende.

        Ich schnippel erstmal grosszügig alles weg dann bleibt ungefähr das hier übrig:

        <?php

        echo <<< EOT
        <html>
        <head>
        </head>

        <body>

        $navigation

        <table width="50" border="1">

        $listofproducts

        </table>
        </body>
        </html>
        EOT;
        ?>

        Sehr nützlich für längere HTML-Abschnitte ist die here doc Schreibweiser, lies dazu http://de3.php.net/manual/de/language.types.string.php#language.types.string.syntax.heredoc

        Viele Grüße

        lulu

        --
        bythewaythewebsuxgoofflineandenjoytheday
        1. Hello Lulu,

          Ich schnippel erstmal grosszügig alles weg dann bleibt ungefähr das hier übrig:

          <?php

          echo <<< EOT

          ...

          EOT;
          ?>

          Sehr nützlich für längere HTML-Abschnitte ist die here doc Schreibweiser, lies dazu http://de3.php.net/manual/de/language.types.string.php#language.types.string.syntax.heredoc

          Du weißt hoffentlich, dass die heredoc-Syntax Probleme macht, wenn man das Speicherformat (DOS, MAC, UNIX) nicht einhält?

          Harzliche Grüße aus http://www.annerschbarrich.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau
          1. Huhu Tom

            Du weißt hoffentlich, dass die heredoc-Syntax Probleme macht, wenn man das Speicherformat (DOS, MAC, UNIX) nicht einhält?

            Nö, was meinst Du? Die unterschiedlichen Steuerzeichen bei Zeilenumbrüchen vielleicht?
            Das liegt dann wohl eher am FTP-Client wenn der beim kopieren Murx macht.
            Naja, am Mac mache ich eigentlich nie was, also bisher hatte ich keine
            Probleme.

            Gute Nacht

            lulu

            --
            bythewaythewebsuxgoofflineandenjoytheday
        2. Hallo LuLu

          Wie lange bist Du denn noch wach?
          Noch lange (schaut so aus)
          Fein.

          Warum?

          Also erstmal würde ich Dir empfehlen Dein Skript etwas übersichtlicher
          aufzubauen.

          Sorry, für mich ist es übersichtlich, wenn es für Euch nicht so toll ist, ich bin lernfähig (aber heute nicht mehr so ganz).

          Die Programmlogik oder Verarbeitung der Daten an den Anfang, das HTML
          an das Ende.

          Ich schnippel erstmal grosszügig alles weg dann bleibt ungefähr das hier übrig:

          <?php

          echo <<< EOT
          <html>
          </body>
          </html>
          EOT;
          ?>

          Wo ist mein Rest? Was ist EOT?

          Sehr nützlich für längere HTML-Abschnitte ist die here doc Schreibweiser, lies dazu http://de3.php.net/manual/de/language.types.string.php#language.types.string.syntax.heredoc

          Das schaut recht kompliziert aus, nichts für den heutigen Abend.

          Könnt ihr mir nicht doch einen Tip geben, wie es mir gelingt ein Element aus einem Array zu löschen?

          Und auch ein Beispiel für das Ausgliedern vom Code. Ich mache das immer mit extra Dateien welche ich mit include() einbinde.

          HeikoH

          1. Hello,

            Könnt ihr mir nicht doch einen Tip geben, wie es mir gelingt ein Element aus einem Array zu löschen?

            so wie Du es versucht hast, nur das Element muss auch vorhanden sein.

            $_data = array();
              $_data['eins'] = 'Hallo';
              $_data['zwei'] = 'World';

            print_r($_data);

            unset($_data['zwei']);

            print_r($_data);

            Probier das mal aus...

            Harzliche Grüße aus http://www.annerschbarrich.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau
            1. Hallo Tom,

              print_r($_data);

              Probier das mal aus...

              es funktioniert, kann es sein das ich nicht die Variable $name löschen will, sondern den $wert?
              Dann muss ich mein Array ändern, da mir "$namen" ja ausreichen...

              HeikoH

              1. Hallo Tom,

                übertragen in mein, ich gebe es zu, unübersichtlichen Code funktioniert es auch, allerdings verhaspelt er sich manchmal.
                Da steht im Array nur noch ein Element drin, aber bei den Links werden zwei "aus Liste löschen" angezeigt.
                Oder alles ist lehr, ich drücke ein Link, es wird link 1 und Link 2 als "aus Liste löschen angezeigt" aber nur ein Element ist im Array vorhanden...
                Ich verzweifel einfach mal.

                HeikoH

                1. Hello,

                  du solltst Di auf jeden Fall eine passenden Vorstellung von den Arrays machen.
                  Arrays sind in PHP verkettete Listen.

                  <img src="http://selfhtml.bitworks.de/EinfachesArray500.gif" border="0" alt="">

                  Und wenn Du mehrdimensionale Arrays hast, dann können in den Knoten anstelle eines Wertes die Anfangspunkte für eine neue Kette liegen:

                  <img src="http://selfhtml.bitworks.de/VerzweigtesArray500.gif" border="0" alt="">

                  Und schau Dir nochmla genau die Arrayfunktionen an:

                  http://de3.php.net/manual/de/ref.array.php

                  Insbesondere count() und foreach().

                  Harzliche Grüße aus http://www.annerschbarrich.de

                  Tom

                  --
                  Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                  Nur selber lernen macht schlau
                  1. Hallo Tom,

                    <img src="http://selfhtml.bitworks.de/VerzweigtesArray500.gif" border="0" alt="">

                    dieses Bild hatte ich schon in der Suchfunktion hier gefunden.
                    Ist meiner Meinung nach, die beste Arrayerklärung!

                    Und schau Dir nochmla genau die Arrayfunktionen an:

                    http://de3.php.net/manual/de/ref.array.php

                    und das die beste ANleitung.

                    Ich danke Dir!

                    HeikoH

                    1. Huhu Heiko

                      Ist meiner Meinung nach, die beste Arrayerklärung!
                      und das die beste ANleitung.
                      Ich danke Dir!

                      Mmmmh, kann es sein dass da ein Hauch von Ironie mitschwingt?
                      Wenn nein ist ja alles bestens.
                      Ansonsten gibt es ja noch andere Erklärungen und Anleitungen.

                      Z.B. diese hier

                      http://php-faq.de/ch/ch-arrays.html

                      http://schattenbaum.net/php/array.php

                      Viele Grüße

                      lulu

                      --
                      bythewaythewebsuxgoofflineandenjoytheday
          2. Huhu Heiko

            Wo ist mein Rest?

            Tja, den habe ich mal ein wenig umgebaut, ich weiss nicht ob ich
            begriffen habe was Du eigentlich umsetzen möchtest, aber naja.

            Ist wirklich schon ein bischen spät.
            Also eigentlich wollte ich Dir empfehlen Dich mit Arrays im allgemeinen um mit den super global Arrays im besonderen zu beschäftigen.

            Hier mal eine Version mit super global Arrays etc.

            So ungefähr würde ich es jedenfalls machen, nur als Vorschlag ...

            <?php

            session_start();

            // ggf. Session- Variable initialisieren
            if (!isset($_SESSION['vergleichprodukt'])) {
             $_SESSION['vergleichprodukt'] = array();
            }

            // ggf. Produkt hinzufuegen
            if (isset($_GET['add'])) {
             array_push($_SESSION['vergleichprodukt'], $_GET['add']);
            }

            // ggf. Produkt entfernen
            if (isset($_GET['remove'])) {
             $k = array_search($_GET['remove'], $_SESSION['vergleichprodukt']);
             unset($_SESSION['vergleichprodukt'][$k]);
            }

            $produkte = array(
             1 => 'Taschenlampe',
             2 => 'Taschenmesser',
             3 => 'Taschenflasche',
             4 => 'Taschenbär',
            );

            $navigation = '';

            foreach ($produkte as $k => $v){

            if (in_array($k, $_SESSION['vergleichprodukt'])){
              $navigation .= <<< EOT
            <a href="{$_SERVER['PHP_SELF']}?remove=$k">$v aus Liste l&ouml;schen</a><br>
            EOT;
             }else{
              $navigation .= <<< EOT
            <a href="{$_SERVER['PHP_SELF']}?add=$k">$v zur Liste hinzufügen</a><br>
            EOT;

            }
            }
            $listofproducts = '';

            if (count($_SESSION['vergleichprodukt']) > 0){
             foreach($_SESSION['vergleichprodukt'] as $k) {
              $v = $produkte[$k];
              $listofproducts .= sprintf('<tr><td>%s</td><td>%s</td></tr>', $k, $v);
             }
            }else{
             $listofproducts = '<tr><td>Leer</td></tr>';
            }

            echo <<< EOT
            <html>
            <head>
            </head>

            <body>

            $navigation

            <table width="50" border="1">

            $listofproducts

            </table>
            </body>
            </html>
            EOT;
            ?>

            Was ist EOT?

            EOT steht für "end of text".

            Gute Nacht und viele Grüße

            lulu

            --
            bythewaythewebsuxgoofflineandenjoytheday
            1. Hello,

              echo <<< EOT
              <html>
              <head>
              </head>

              <body>

              $navigation

              <table width="50" border="1">

              $listofproducts

              </table>
              </body>
              </html>
              EOT;
              ?>

              Was ist EOT?

              EOT steht für "end of text".

              Du kannst aber auch jeden anderen Bezichner benutzen, der noch frei ist.
              In der obersten Zeile wird der Textblock mit  '<<< EOT' eingeleitet und
              in der zeile vor dem PHP-Schließ-Tag steht 'EOT;' für das Ende des Blockes.
              Man könnte die Marken auch als eine zusätzliche Art Häkchen oder "Superhäkchen"
              bezeichnen.

              Harzliche Grüße aus http://www.annerschbarrich.de

              Tom

              --
              Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
              Nur selber lernen macht schlau
              1. Huhu Tom

                Du kannst aber auch jeden anderen Bezeichner benutzen, der noch frei ist.

                Ja, dass habe ich eine zeitlang auch fleissig benutzt und mir immer
                ganz kreativ neue Bezeichner für EOT ausgedacht.

                Das fand ich dann aber irgendwann doch unsinnig und benutze jetzt
                nur noch EOT, das ist ja quasi standard.

                Und ich wundere mich später nicht wenn da irgendwo im Quelltext ein

                SOUNDNUISSESHIERZUENDE;

                oder ähnliches steht.

                Bei EOT; weiß ich halt gleich aha, da ist das Ende eines here doc Abschnittes.

                Viele Grüße

                lulu

                --
                bythewaythewebsuxgoofflineandenjoytheday
  2. Hello,

    session_register("vergleichprodukt");

    Das sollte man nicht mehr verwenden, sondern $_SESSION['vergleichprodukt'] = wert;

    if (isset($del_vergleich)) {
      unset($vergleichprodukt['$del_vergleich']);
    }

    Und hier wäre es günstiger

    unset($vergleichprodukt[$del_vergleich]);

    zu schreiben.

    Harzliche Grüße aus http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    1. Das sollte man nicht mehr verwenden, sondern $_SESSION['vergleichprodukt'] = wert;

      Danke Dir, ich bin da etwas altmodisch NOCH, leider...

      Und hier wäre es günstiger

      unset($vergleichprodukt[$del_vergleich]);

      zu schreiben.

      ...funktioniert aber auch nicht.
      Trotzdem danke der Hinweise.

      HeikoH

      1. Hello,

        ...funktioniert aber auch nicht.
        Trotzdem danke der Hinweise.

        Dann solltet Du in Deinem Script während der Testphase ganz vorne:

        ini_set('track_errors','1');
        error_reporting(E_ALL);

        aufnehmen. Dann solltst Du entsprechende Warungen bekommen, wenn Du versuchst, nicht vorhandene Elemente (Variablen) zu löschen.

        Harzliche Grüße aus http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
        1. Hallo Tom,

          ini_set('track_errors','1');

          wofür ist das eigentlich?

          1. Hello,

            ini_set('track_errors','1');

            wofür ist das eigentlich?

            Das ist dafür gut, dass erweiterte Fehlermeldungen generiert werden.
            So steht dann z.B. in der Variable $php_errormsg die Fehlermeldung mit Zeilennummer zur Verfügung, auch wenn man diese aus diversen Gründen z.B. unterdrückt hat:

            $fh = @fopen(...);

            wenn das nun einen Fehler auslöst, sthet die Meldung in $php_errormsg.

            Speziell, wenn man mit header() arbeitet, will man häufig die Fehlermeldung nicht sofort sehen, sondern erst nach dem Senden des Headers.

            http://de3.php.net/manual/de/function.error-reporting.php

            Außerdem stehen Werte in den "Magischen Konstanten" zur Verfügung.
            http://de2.php.net/manual/de/language.constants.predefined.php

            Harzliche Grüße aus http://www.annerschbarrich.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau
        2. Hallo Tom,

          ini_set('track_errors','1');
          error_reporting(E_ALL);

          kannte ich überhaupt nicht, muss mal in den Manuals nachschauen was das ist.

          aufnehmen. Dann solltst Du entsprechende Warungen bekommen, wenn Du versuchst, nicht vorhandene Elemente (Variablen) zu löschen.

          ich habe es nach session_start() und als erstes im BODY eingefügt, passiert aber nichts!?!
          Grüsse von
          HeikoH