christoph: Array nach Leeren durchsuchen und löschen?

Hallo,

Kann ich mit einer Funktion im Array nach Leeren[] durchsuchen lassen und löschen?

danke
gruss chris

  1. Lieber chris,

    Kann ich mit einer Funktion im Array nach Leeren[] durchsuchen lassen und löschen?

    Jein. Meines Wissens nicht mit _einer_ Funktion alleine.

    Was hast Du schon als Lösungsansatz entwickelt?

    Liebe Grüße aus Ellwangen,

    Felix Riesterer.

    1. nein noch nicht. gebe aber bescheid, wenn ich was herausbekomme.

  2. echo $begrüßung;

    Kann ich mit einer Funktion im Array nach Leeren[] durchsuchen lassen und löschen?

    Ja, array_walk() bietet sich da an.

    echo "$verabschiedung $name";

    1. Lieber dedlfix,

      array_walk() bietet sich da an.

      Mit array_walk() kann man das zu bearbeitende Array aber nicht verändern. Es gibt meines Wissens keine Funktion, die ein Array nach einem Wert durchsucht, und diesen dann gleich auch noch aus dem Array löscht.

      Aber mit array_walk() kann man sich soetwas programmieren, das ist richtig.

      Liebe Grüße aus Ellwangen,

      Felix Riesterer.

      1. echo $begrüßung;

        Mit array_walk() kann man das zu bearbeitende Array aber nicht verändern.

        Das geht schon:

          
        function removeEmptyElement($value, $key, $array) {  
          if (empty($value))  
            unset($array[$key]);  
        }  
          
        array_walk($array, 'removeEmptyElement', &$array);  
        
        

        Beachte die Referenz bei der Übergabe des dritten Parameters. Allerdings hat diese Lösung einen Schönheitsfehler, der sich mit einer "Call-time pass-by-reference has been deprecated"-Warnung zeigt.

        Es gibt meines Wissens keine Funktion, die ein Array nach einem Wert durchsucht, und diesen dann gleich auch noch aus dem Array löscht.

        Man muss ja auch nicht für alle denkbaren und undenkbaren Fälle eine Funktion vorhalten. Das muss ja auch noch alles gewartet werden...

        Ich hab nochmal was probiert und ein foreach als genau so zweckmäßig und elegant empfunden:

          
        foreach ($array as $key => $value)  
          if (empty($value))  
            unset($array[$key]);  
        
        

        Ich würde dies dann doch dem array_walk() vorziehen.

        echo "$verabschiedung $name";

        1. Lieber dedlfix,

          function removeEmptyElement($value, $key, $array) {
            if (empty($value))
              unset($array[$key]);
          }

          array_walk($array, 'removeEmptyElement', &$array);

            
          Ich meine in der [Funktions-Referenz](http://de2.php.net/manual/de/function.array-walk.php) gelesen zu haben, dass genau das problematisch sei.  
            
          <Zitat von http://de2.php.net/manual/de/function.array-walk.php>  
          
          > Von der Benutzerfunktion aus darf das Array selbst nicht geändert werden, wie zum Beispiel durch Hinzufügen oder Löschen eines Elementes, etc. Wird das auf array\_walk() angewendete Array geändert, so ist das Verhalten dieser Funktion undefiniert und unvorhersagbar.  
          
          </Zitat>  
            
          
          > Beachte die Referenz bei der Übergabe des dritten Parameters. Allerdings hat diese Lösung einen Schönheitsfehler, der sich mit einer "Call-time pass-by-reference has been deprecated"-Warnung zeigt.  
            
          Eben.  
            
          
          > > Es gibt meines Wissens keine Funktion, die ein Array nach einem Wert durchsucht, und diesen dann gleich auch noch aus dem Array löscht.  
          >   
          > Man muss ja auch nicht für alle denkbaren und undenkbaren Fälle eine Funktion vorhalten. Das muss ja auch noch alles gewartet werden...  
            
          Aber genau \_das\_ war die Frage des OPs. Und meine Antwort darauf war "Jein".  
            
          
          > Ich hab nochmal was probiert und ein foreach als genau so zweckmäßig und elegant empfunden:  
          >   
          > ~~~php
            
          
          > foreach ($array as $key => $value)  
          >   if (empty($value))  
          >     unset($array[$key]);  
          > 
          
          

          Genau danach hat der OP wohl gesucht. Aber das hätte er dann selbst entwickeln müssen. Du hast ihm soeben die Arbeit abgenommen (wenn er wieder mal hereinschaut).

          Liebe Grüße aus Ellwangen,

          Felix Riesterer.

          1. echo $begrüßung;

            Von der Benutzerfunktion aus darf das Array selbst nicht geändert werden, wie zum Beispiel durch Hinzufügen oder Löschen eines Elementes, etc.

            So "weit runter" hatte ich nicht gelesen. Wieder ein Argument weniger für array_walk()

            ... "Call-time pass-by-reference has been deprecated"-Warnung ...
            Eben.

            Hier sehe ich keinen direkten Zusammenhang. Dieses deprecated bezieht sich nur auf die Art der Übergabe.

            Dies ist deprecated:
            function foo($normalerweiseAlsKopie) / foo(&$dochAlsReferenz)

            Das jedoch nicht:
            function foo(&$alsReferenz) / foo($var)

            Ich hätte eigentlich auch
            function removeEmptyElement($value, $key, &$array)
            statt
            function removeEmptyElement($value, $key, $array)
            schreiben wollen, und die Warnung hätte keinen Grund mehr gehabt.

            Aber schon die Funktion array_walk() nimmt den userdata-Parameter nur per Kopie entgegen und das kann ich als Anwender ja nicht ändern.
            Eine Übergabe des Variablennamens als String empfand ich als zu unflexibel, da die Array-Variable nicht im Geltungsbereich von removeEmptyElement liegt und auch nicht zwingend im globalen Adressbereich ($GLOBALS[$arrayname]) liegen muss.

            Ich hab nochmal was probiert und ein foreach als genau so zweckmäßig und elegant empfunden:
            Genau danach hat der OP wohl gesucht. Aber das hätte er dann selbst entwickeln müssen. Du hast ihm soeben die Arbeit abgenommen (wenn er wieder mal hereinschaut).

            Nun ja, manchmal kann man auch aus Beispielen lernen. Und manchmal sagt auch ein Bild mehr als 1000 Worte.

            Du kannst ganz unbesorgt sein, ich werde so oft es geht nur den Weg aufzeigen. Doch manchmal diskutiert man aufgrund eines Postings etwas und dann halte ich es für kontraproduktiv nur Andeutungen zu geben, damit der OP auch ja self auf die Lösung kommt.

            echo "$verabschiedung $name";

      2. Huhu Felix

        Es gibt meines Wissens keine Funktion, die ein Array nach einem Wert durchsucht, und diesen dann gleich auch noch aus dem Array löscht.

        Doch so etwas ähnliches gibt es und zwar array_filter()

        http://de3.php.net/manual/de/function.array-filter.php

        Um leere Elemente aus einem Array zu filtern braucht man noch nicht einmal eine Callback-Funktion bemühen

        Also z.B. so

        $a = array('a','b','','','e');
        $b = array_filter($a);

        Viele Grüße

        lulu

        --
        bythewaythewebsuxgoofflineandenjoytheday
        1. Hallo!

          Doch so etwas ähnliches gibt es und zwar array_filter()

          http://de3.php.net/manual/de/function.array-filter.php

          Um leere Elemente aus einem Array zu filtern braucht man noch nicht einmal eine Callback-Funktion bemühen

          Also z.B. so

          $a = array('a','b','','','e');
          $b = array_filter($a);

          Jepp, aber man muss beachten dass in diesem Fall auch Elemente mit Werten  wie 0, 0.0, '', '0', array()... entfernt werden, was sich (falls das problematisch sein sollte) per callback-Funktion verhindern lässt.

          Grüße
          Andreas

          --
          SELFHTML Tipps & Tricks: http://aktuell.de.selfhtml.org/tippstricks/
  3. Hello,

    Kann ich mit einer Funktion im Array nach Leeren[] durchsuchen lassen und löschen?

    Ist ganz schön missverständlich, Deine Frage...
    Aber aus dem weiteren Thread entnehme ich, dass leere Elemente entfernt werden sollen.
    Da müsstest Du erstmal defininieren, wodurch ein Leerelement überhaupt gekennzeichnet wird.

    Und dann wirst Du ggf. eine rekursive Funktion benötigen. Lulus Vorschlag bezog sich nur auf ein "gerades" Array, also nicht auf einen Baum.

    Dann funktioniert das mit foreach().
    Dabei durchläufst Du die der Funktion übergebene Struktur als Kopie und löschst aus dem Original die gefundenen Luschen heraus.

    Alternativ müsste hierfür ggf. auch array_map() herhalten können.

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

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau