Sam: Array von bestimmten Elementen befreien?

Moin,

ich steht vor einem Problem und ich weiß nicht warum ich nicht weiterkomme. Also ich bekomme ein Array und möchte aus diesem Array alle Einträge entfernen, die aus nur unsichtbaren Zeichen bestehen (Leerzeichen etc.). Es haut aber nicht hin. Irgendwo bleiben immer leere Elemente im Array zurück, je nachdem wo das Array gefüllt ist.
So sieht mein Code bis jetzt aus:

for ($i = 0; $i < count($options); $i++) {

if (trim($options[$i]) == '' || trim($options[$i]) == ' ') {

unset($poll_options[$i]);
  }
}

Ich danke euch für eure Hilfe, ich weiß jetzt echt nicht mehr weiter.

Gruß,Sam

  1. Hallo Sam,

    So sieht mein Code bis jetzt aus:

    for ($i = 0; $i < count($options); $i++) {

    if (trim($options[$i]) == '' || trim($options[$i]) == ' ') {

    unset($poll_options[$i]);
      }
    }

    Ich denke mal, es wird damit zu tun haben, dass du das Array mit einem Zähler durchläufst und während der Durchläufe Array-Elemente löscht. Damit stimmt der Zähler ja nicht mehr mit der eigentlichen Array-Position überein.

    Du könntest entweder den Zähler bei jedem UNSET entsprechend manipulieren, oder einfach jedes Element mit Inhalt in ein neues Array kopieren.

    Ich danke euch für eure Hilfe, ich weiß jetzt echt nicht mehr weiter.

    Da nicht für!

    Gruß, André

    1. Nochmal hallo,

      es sollte natürlich auch gehen, wenn du das Array rückwärts durchläufst, weil bei jedem UNSET ja nur die Positionen ab dem gelöscheten Element geändert werden.

      Ohne das jetzt getestet zu haben:

      for ($i = count($options)-1; $i >= 0; $i--) {

      if (trim($options[$i]) == '' || trim($options[$i]) == ' ') {

      unset($poll_options[$i]);
         }
       }

      Gruß, André

    2. Ich bin so ein Idiot. So wie dus beschrieben hast hab ichs auch schon probiert gehabt, jetzt bin ich draufgekommen, dass ich statt && ein || verwendet hab, mein Gott bin ich dumm :)
      Jetzt funktionierts auch.

      1. Hallo,

        Ich bin so ein Idiot. So wie dus beschrieben hast hab ichs auch schon probiert gehabt, jetzt bin ich draufgekommen, dass ich statt && ein || verwendet hab, mein Gott bin ich dumm :)

        Also das muß ich jetzt nicht verstehen, oder? Denn der zweite Teil deiner IF-Abfrage ist meines erachtens eh unnötig, da

        trim(IRGENDWAS) == ' '

        niemals TRUE sein kann. Trim entfernt u.A. alle Leerzeichen am Anfang und am Ende von IRGENDWAS, das Ergebnis kann also niemals ein Leerzeichen sein.

        Wenn du also ein && verwendest, wird die Bedingung der IF-Abfrage niemals TRUE, entsprechend wird der Anweisungsblock der IF-Abfrage nie ausgeführt.

        Gruß, André

        1. Also ich habs jetzt eben so gelöst, dass ich alle gültigen in ein neues Array umschreibe. Und ich habe einmal mehere Leerzeichen hintereinander eingegeben und heraus kam nach dem trim() ein Leerzeichen. Deshalb habe ich das so gemacht.

    3. Hi,

      also erstmal: ich verstehe nicht, wieso hier $options durchlaufen, aber aus $poll_options gelöscht wird. Vielleicht erklärt das ja schon einiges...

      Ich denke mal, es wird damit zu tun haben, dass du das Array mit einem Zähler durchläufst und während der Durchläufe Array-Elemente löscht. Damit stimmt der Zähler ja nicht mehr mit der eigentlichen Array-Position überein.

      doch - der Zähler stimmt immer noch mit der aktuellen Position überein, da das Array nach einem unset() nicht neu indiziert wird. Dies sollte man allerdings nach dem Schleifendurchlauf tun, damit man keine Lücken im Array erhält, z.B.:

      <?php

      $_test = array('a', 'b', 'c', '', 'd', ' ', 'e');

      for ($i = 0; $i < count($_test); $i++) {

      if (trim($_test[$i]) === '')
              unset($_test[$i]);

      }

      $_test = array_values($_test);

      echo '<pre>';
      print_r($_test);
      echo '</pre>';

      /*
      Ausgabe:

      Array
      (
          [0] => a
          [1] => b
          [2] => c
          [3] => d
          [4] => e
      )
      */

      ?>

      Gruß,
      Andreas.

      1. Hallo Andreas,

        doch - der Zähler stimmt immer noch mit der aktuellen Position überein, da das Array nach einem unset() nicht neu indiziert wird. Dies sollte man allerdings nach dem Schleifendurchlauf tun, damit man keine Lücken im Array erhält ...

        Du hast natürlich vollkommen recht. Hab ich mal wieder vergessen, mein Hirn vor dem Posten warmlaufen zu lassen :-)

        Gruß, André

        1. Hi,

          Hab ich mal wieder vergessen, mein Hirn vor dem Posten warmlaufen zu lassen :-)

          ist ja bald Feierabend, da passiert das schonmal ;-)

          Gruß,
          Andreas.

    4. Hi!

      Ich denke mal, es wird damit zu tun haben, dass du das Array mit einem Zähler durchläufst und während der Durchläufe Array-Elemente löscht.
      Damit stimmt der Zähler ja nicht mehr mit der eigentlichen Array-Position überein.

      Du könntest entweder den Zähler bei jedem UNSET entsprechend manipulieren, oder einfach jedes Element mit Inhalt in ein neues Array kopieren.

      Nein, versuche mal folgendes Script:
      <?php
      $array = array('a','b','c');
      var_dump($array);
      unset($array[1]);
      var_dump($array);
      ?>

      Das ergibt:

      array(3) {
        [0]=>
        string(1) "a"
        [1]=>
        string(1) "b"
        [2]=>
        string(1) "c"
      }
      array(2) {
        [0]=>
        string(1) "a"
        [2]=>
        string(1) "c"
      }

      Grüße
      Andreas

      --
      SELFHTML Feature Artikel: http://aktuell.de.selfhtml.org/artikel/
  2. Hallo!

    ich steht vor einem Problem und ich weiß nicht warum ich nicht weiterkomme. ... möchte aus diesem Array alle Einträge entfernen, die aus nur unsichtbaren Zeichen bestehen

    Also ich habe die Funktion noch nie verwendet, aber bezüglich Deinem Problem scheint sie angebracht: http://at.php.net/manual/de/function.array-filter.php.

    Beste Grüße
    Viennamade

    1. Die hatte ich auch schon in dem Zusammenhang gefunden, allerdings kann ich mit der ja nur eine Funktion aufrufen. Allein auf ein Array angebracht tut die gar nichts. Hab ich in meiner Verzweiflung auch schon getestet, aber jetzt klappts ja zum Glück.

      1. Hi,

        Allein auf ein Array angebracht tut die gar nichts. Hab ich in meiner Verzweiflung auch schon getestet, aber jetzt klappts ja zum Glück.

        doch - array_filter() ohne Angabe einer Callback-Funktion filtert alle Werte aus dem Array, welche false entsprechen (also auch 0, '0', null, usw.) - siehe auch http://de3.php.net/manual/en/function.array-filter.php, 2. Beispiel. Wenn du weißt, dass dein Array nur Strings enthält, welche ungleich false sind, kannst du diese Funktion durchaus anwenden. Da ein Leerzeichen allerdings ebenfalls ungleich false ist, musst du, um diese auch zu entfernen, vorher noch trim() auf dein Array anwenden:

        <?php

        /*
         * array_map() sorgt für die Anwendung von trim() auf alle Elemente des Arrays
         * array_values() für die Neuindizierung des Arrays
         */
        $_array = array_values(array_filter(array_map('trim', $_array)));

        ?>

        Gruß,
        Andreas.