[OOP] unset() funktioniert nicht

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • [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?

    Last edited by 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.

    Comment


    • #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.

      Comment


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

        Comment


        • #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

          Comment


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

            arrays sind klasse

            Comment


            • #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.

              Comment


              • #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).

                Comment


                • #9
                  Danke, sehr anschaulich
                  arrays sind klasse

                  Comment


                  • #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.
                    Last edited by getphp; 22-04-2005, 11:31.

                    Comment

                    Working...