[OOP] unset() funktioniert nicht

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

  • [OOP] unset() funktioniert nicht

    Hallo Leute,

    ich habe eine Klasse, in deren Konstruktor ich eine Methode aufrufe. In dieser Methode durchlaufe ich das Array $this->tree mit einer for-Schleife. Unter bestimmten Bedingungen soll unset($this->tree[$i]) ausgeführt werden. Allerdings klappt dies nicht so recht -- nur die erste Hälfte das Arrays wird komischerweise gelöscht.
    Habe deswegen alle Bedingungen entfernt, um somit jedes Array-Element von $this->tree mit unset() zu löschen. Aber dies hat auch nicht geklappt... warum auch immer. Jedenfalls habe ich festgestellt, dass der Befehl $this->tree[$i] = FALSE; funktioniert. Allerdings nütz mit dies wenig, da die Array-Elemente nicht entfernt, sondern einfach als FALSE gesetzt werden; ich brauch sie aber ganz weg.

    Das klappt NICHT:
    PHP-Code:
    <?php
    function setTree()
    {
     for(
    $i 0$i count($this->tree); $i++)
     {
      unset(
    $this->tree[$i]);
     }
    }
    ?>
    Das klappt SCHON:
    PHP-Code:
    <?php
    function setTree()
    {
     for(
    $i 0$i count($this->tree); $i++)
     {
      
    $this->tree[$i] = FALSE;
     }
    }
    ?>
    Was ist der Grund für diesen Fehler und wie kann ich ihn vermeiden?

    Zuletzt geändert von Maranello-550; 21.04.2005, 20:48.
    arrays sind klasse

  • #2
    optimal wäre es, wenn du noch ne print_r ausgabe von $this->tree zeigen könntest, bzw. mit geschickt eingefädelten echo testausgaben festmachen könntest, wo sich was unerwartet verhält.

    Kommentar


    • #3
      Re: [OOP] unset() funktioniert nicht

      Original geschrieben von Maranello-550
      PHP-Code:
      for($i 0$i count($this->tree); $i++)
       {
        unset(
      $this->tree[$i]);
       } 
      jetzt denken wir mal kurz logisch nach (und du machst bitte mit ;-))

      das array habe mal 10 elemente.

      start der schleife, bedingung überprüfen: count($this->tree) ergibt 10, $i ist gleich 0 und damit kleiner -> array-element 0 wird mittels unset entfernt.

      nächster durchlauf, bedingung prüfen: count($this->tree) ergibt 9 - weil du ja gerade ein element aus dem array rausgekickt hast. OK, bedingung trotzdem noch erfüllt, weil $i gleich 1 - nächstes element wird entfernt.

      nächster durchlauf, bedingung prüfen: count($this->tree) ergibt jetzt 8 - etc. pp., du merkst sicher wie's weiter geht.

      nur die erste Hälfte das Arrays wird komischerweise gelöscht.
      in jedem durchgeführten schleifendurchlauf wird die länge des arrays um eins verkürzt - ergo wird auch die abbruchbedingung immer kleiner. und somit "trifft" sich das dann irgendwo in der mitte ...


      also, anzahl elemente im array vor der schleife ermitteln, und dann als festen wert in die abbruchbedingung einsetzen.
      I don't believe in rebirth. Actually, I never did in my whole lives.

      Kommentar


      • #4
        OffTopic:
        ich stelle mich freiwillig in die ecke und schäme mich.

        Kommentar


        • #5
          @wahsaga
          Die Überlegung ist mir nicht neu
          Daher habe ich auch den Test mit $this->tree[$i] = FALSE; gemacht, was perfekt funktioniert und ganz durch geht.
          Dennoch ist scheinbar etwas dran.
          Bisher habe ich aber auch angenommen, dass die for-schleife nicht bei jedem Durchlauf die Abbruchbedingung neu auswertet.

          Trotzdem blöd die Angelegenheit! Wie krig ich das Array-Element dann weg?

          arrays sind klasse

          Kommentar


          • #6
            ... gut, auch der eben erwähnte Test ist Blödsinn, da das Element erhalten bleibt.

            arrays sind klasse

            Kommentar


            • #7
              Original geschrieben von Maranello-550
              Bisher habe ich aber auch angenommen, dass die for-schleife nicht bei jedem Durchlauf die Abbruchbedingung neu auswertet.
              warum sollte sie das denn nicht tun?
              du hast einen funktionsaufruf da rein geschrieben, also wird diese funktion auch bei jedem prüfen der bedingung aufgerufen. das sollte einem aber eigentlich klar sein ...

              Trotzdem blöd die Angelegenheit! Wie krig ich das Array-Element dann weg?
              du möchtest den letzten satz meines vorherigen postings noch mal lesen.


              @penizillin: ;-)
              I don't believe in rebirth. Actually, I never did in my whole lives.

              Kommentar


              • #8
                PHP-Code:
                <pre>
                <?php
                // 4 identische Array erzeugen
                for ($i 0$i 20$i++) $a[$i] = $i;
                $b $a
                $c $a;
                $d $a;

                for (
                $i=0$i<count($a); $i++) // <- deine Variante
                    
                if ($i%2)
                        unset(
                $a[$i]); // <- 15, 17, 19 werden nicht gelöscht
                print_r($a);

                $anz count($b);
                for (
                $i=0$i<$anz$i++) // <- wahsaga's variante
                    
                if ($i%2)
                        unset(
                $b[$i]);
                print_r($b);

                for (
                $i=0$anz=count($c); $i<$anz$i++) // <- wahsaga^schick
                    
                if ($i%2)
                        unset(
                $c[$i]);
                print_r($c);

                for (
                $i=count($d); $i>0$i--) // <- so gehts auch
                    
                if ($i%2)
                        unset(
                $d[$i]);
                print_r($d);
                ?>
                </pre>
                The syntax of a for loop is:

                for (expr1; expr2; expr3)
                statement

                The first expression (expr1) is evaluated (executed) once unconditionally at the beginning of the loop.

                In the beginning of each iteration, expr2 is evaluated. If it evaluates to TRUE, the loop continues and the nested statement(s) are executed. If it evaluates to FALSE, the execution of the loop ends.

                At the end of each iteration, expr3 is evaluated (executed).

                Kommentar


                • #9
                  Danke, sehr anschaulich
                  arrays sind klasse

                  Kommentar


                  • #10
                    Hallo!

                    Wenn das komplette Array gelöscht werden soll, wäre das nicht so sinnvoller (auch schneller):

                    PHP-Code:
                    $this->tree = array(); 
                    Mal abgesehen davon, dass Arrays sowieso ein Fall für die foreach-Schleife sind

                    PHP-Code:

                    function setTree$bedingung ) {
                      foreach ( 
                    $this->tree as $key => $value ) {
                        if ( 
                    $value === $bedingung ) {
                          unset(
                    $this->tree[$key]);
                        }
                      }

                    Just my 2 Cents ...


                    PS: Die Funktion in_array() könnte auch nützlich sein.
                    Zuletzt geändert von getphp; 22.04.2005, 11:31.

                    Kommentar

                    Lädt...
                    X