php array_filter ohne Schlüsselerhaltung

Lesezeit: 2 Minuten

Benutzer-Avatar
Pistazie

Wenn ich ein Array mit array_filter filtere, um Nullwerte zu eliminieren, werden Schlüssel beibehalten und dies erzeugte “Löcher” im Array. Z.B:

The filtered version of
    [0] => 'foo'
    [1] =>  null
    [2] => 'bar'
is 
    [0] => 'foo'
    [2] => 'bar'

Wie kann ich stattdessen bekommen

[0] => 'foo'
[1] => 'bar'

?

  • Mögliches Duplikat von After array_filter(), wie kann ich die Tasten zurücksetzen, um in numerischer Reihenfolge beginnend bei 0 zu gehen

    – ggorlen

    28. Januar 2019 um 21:51 Uhr

Du könntest benutzen array_values nach dem Filtern, um die Werte zu erhalten.

Benutzer-Avatar
mickmackusa

Mit dieser Eingabe:

$array=['foo',NULL,'bar',0,false,null,'0',''];

Es gibt ein paar Möglichkeiten, wie Sie könnte Tu es. Demo

Es ist etwas off-topic, es anzusprechen array_filter‘s gieriges Standardverhalten, aber wenn Sie zu dieser Seite googeln, sind dies wahrscheinlich wichtige Informationen, die für Ihr Projekt/Ihre Aufgabe relevant sind:

var_export(array_values(array_filter($array)));  // NOT GOOD!!!!!

Schlechte Ausgabe:

array (
  0 => 'foo',
  1 => 'bar',
)

Nun zu den Möglichkeiten, die funktionieren:

Methode 1: (array_values(), array_filter() mit !is_null())

var_export(array_values(array_filter($array,function($v){return !is_null($v);})));  // good

Methode Nr. 2: (foreach()automatisch indiziertes Array, !==null)

foreach($array as $v){
    if($v!==null){$result[]=$v;}
}
var_export($result);  // good

Methode Nr. 3: (array_walk()Auto-Index-Array, !is_null())

array_walk($array,function($v)use(&$filtered){if(!is_null($v)){$filtered[]=$v;}});
var_export($filtered);  // good

Alle drei Methoden liefern die folgende “nullfreie” Ausgabe:

array (
  0 => 'foo',
  1 => 'bar',
  2 => 0,
  3 => false,
  4 => '0',
  5 => '',
)

Ab PHP7.4 können Sie sogar ein “Umpacken” wie folgt durchführen: (der Splat-Operator erfordert numerische Tasten)

Code: (Demo)

$array = ['foo', NULL, 'bar', 0, false, null, '0', ''];

$array = [...array_filter($array)];

var_export($array);

Ausgabe:

array (
  0 => 'foo',
  1 => 'bar',
)

… aber wie sich herausstellt, ist das “Umpacken” mit dem Splat-Operator weitaus weniger effizient als das Anrufen array_values().

1299890cookie-checkphp array_filter ohne Schlüsselerhaltung

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

Privacy policy