Wie kann ich ein Array implodieren, während ich leere Array-Elemente überspringe?

Lesezeit: 3 Minuten

Benutzer-Avatar
Tom Auger

Perls join() ignoriert (überspringt) leere Array-Werte; PHPs implode() scheint nicht.

Angenommen, ich habe ein Array:

$array = array('one', '', '', 'four', '', 'six');
implode('-', $array);

Erträge:

one---four--six

statt (IMHO bevorzugt):

one-four-six

Irgendwelche anderen eingebauten Funktionen mit dem Verhalten, nach dem ich suche? Oder wird es ein Custom-Jobbie?

  • Sie liegen falsch mit dem Verhalten von Perl. join überspringt keine undefinierten Elemente. Tatsächlich führen sie zu einer Warnung. $a[0]="a"; $a[2]="c"; say join "-",@a; zeigt Use of uninitialized value within @a in join or string und a--c. Man kann verwenden join '-', grep !defined, ... um undefinierte Werte zu überspringen. grep !length, wird leere Zeichenfolgen tun.

    – Ikegami

    12. Mai 2011 um 23:01 Uhr


Benutzer-Avatar
Felix Klinge

Sie können verwenden array_filter():

Wenn nein zurückrufen geliefert wird, alle Einträge von Eingang gleicht FALSE (sehen Umwandlung in Boolean) werden entfernt.

implode('-', array_filter($array));

Offensichtlich wird dies nicht funktionieren, wenn Sie haben 0 (oder jeder andere Wert, der ausgewertet wird false) in Ihrem Array und Sie möchten es behalten. Aber dann können Sie Ihre eigene Callback-Funktion bereitstellen.

  • Soll das heißen falseund 0 werden auch rausgeschmissen?

    – Jess

    12. Mai 2011 um 22:54 Uhr

  • @maz: Ja, aber Sie können jederzeit Ihren eigenen Rückruf bereitstellen. emptywie Sie es verwenden, wird auch behandeln 0 und false wie false (und entfernen) btw.

    – Felix Klinge

    12. Mai 2011 um 22:55 Uhr


  • +1, aber es muss erwähnt werden, dass array_filter() standardmäßig filtert alle aus false, nullleerer String (”) und 0.

    – Tadeck

    12. Mai 2011 um 22:55 Uhr

  • @Tadeck: Ja, folge einfach dem Link im Zitat. Noch mehr Werte werden als berücksichtigt false: leeres Array, 0.0 und "0".

    – Felix Klinge

    12. Mai 2011 um 22:58 Uhr


  • @Felix: Ich wusste es – wollte es nur für Leute betonen, die neu in PHP sind;) Wie auch immer: Danke

    – Tadeck

    12. Mai 2011 um 23:05 Uhr

Benutzer-Avatar
Jess

Ich nehme an, Sie können es nicht als eingebaut betrachten (weil die Funktion mit einer benutzerdefinierten Funktion ausgeführt wird), aber Sie könnten es immer verwenden array_filter.
Etwas wie:

function rempty ($var)
{
    return !($var == "" || $var == null);
}
$string = implode('-',array_filter($array, 'rempty'));

  • Verwenden empty hat den gleichen Effekt, als würde überhaupt kein Rückruf übergeben. Bearbeiten: Sie müssen den Rückgabewert negieren. Andernfalls werden nur leere Elemente zurückgegeben 😉 (eigentlich using empty wie Sie es zuvor getan haben, war auch falsch)

    – Felix Klinge

    12. Mai 2011 um 23:03 Uhr


  • Ja, das ist rückständig. Aber du hast mich auf die richtige Idee gebracht implode('-', array_filter($ary, create_function('$a', 'return $a!="";')));

    – Tom Auger

    12. Mai 2011 um 23:12 Uhr

Benutzer-Avatar
Ali Varli

Zu entfernen null, false, empty Saite aber bewahren 0usw. benutze func. strlen

$arr = [null, false, "", 0, "0", "1", "2", "false"];
print_r(array_filter($arr, 'strlen'));

wird ausgeben:

//Array ( [3] => 0 [4] => 0 [5] => 1 [6] => 2 [7] => false )

Wie Sie Ihren Filter implementieren sollten, hängt nur davon ab, was Sie als “leer” sehen.

function my_filter($item)
{
    return !empty($item); // Will discard 0, 0.0, '0', '', NULL, array() of FALSE
    // Or...
    return !is_null($item); // Will only discard NULL
    // or...
    return $item != "" && $item !== NULL; // Discards empty strings and NULL
    // or... whatever test you feel like doing
}

function my_join($array)
{
    return implode('-',array_filter($array,"my_filter"));
} 

$array = ["one", NULL, "two", NULL, "three"];
$string = implode("-", array_diff($array, [NULL]));
echo $string;

Kehrt zurück one-two-three

Benutzer-Avatar
ozzmotik

Basierend auf dem, was ich finden kann, würde ich sagen, dass es wahrscheinlich keine Möglichkeit gibt, ein dafür eingebautes PHP zu verwenden. Aber du könntest wahrscheinlich etwas in dieser Richtung tun:

function implode_skip_empty($glue,$arr) {
      $ret = "";
      $len = sizeof($arr);
      for($i=0;$i<$len;$i++) {
          $val = $arr[$i];    
          if($val == "") {
              continue;
          } else {
            $ret .= $arr.($i+1==$len)?"":$glue;
          }
      }
      return $ret;
}

Benutzer-Avatar
Jeremy

Versuche dies:

$result = array();

foreach($array as $row) { 
   if ($row != '') {
   array_push($result, $row); 
   }
}

implode('-', $result);

1356880cookie-checkWie kann ich ein Array implodieren, während ich leere Array-Elemente überspringe?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy