Wie kann ich nach array_filter() die Tasten zurücksetzen, sodass sie in numerischer Reihenfolge beginnend bei 0 angezeigt werden?

StackOverflow https://stackoverflow.com/questions/3401850

  •  25-09-2019
  •  | 
  •  

Frage

Ich habe gerade array_filter verwendet, um Einträge, die nur den Wert '' hatten, aus einem Array zu entfernen, und jetzt möchte ich abhängig vom Platzhalter bestimmte Transformationen darauf anwenden, beginnend bei 0, aber leider behält es immer noch den ursprünglichen Index bei.Ich habe eine Weile gesucht und konnte nichts sehen, vielleicht habe ich einfach das Offensichtliche übersehen, aber meine Frage ist ...

Wie kann ich die Indizes des Arrays einfach so zurücksetzen, dass sie bei 0 beginnen und im NEUEN Array der Reihe nach weitergehen, anstatt die alten Indizes beizubehalten?

War es hilfreich?

Lösung

Wenn Sie array_values auf dem Array, wird es reindexed von Null werden.

Andere Tipps

Wenn Sie Array-Filter verwenden, tun es folgt als

$NewArray = array_values(array_filter($OldArray));

Verwenden array_values():

<?php

$array = array('foo', 'bar', 'baz');
$array = array_filter($array, function ($var) {
    return $var !== 'bar';
});

print_r($array); // indexes 0 and 2
print_r(array_values($array)); // indexes 0 and 1

Ich mache mir Sorgen darüber, wie viele Programmierer das unschuldig kopiert/eingefügt haben array_values(array_filter()) Methode in ihre Codes integrieren – Ich frage mich, wie viele Programmierer aufgrund der Gier von array_filter unwissentlich auf Probleme gestoßen sind.Oder schlimmer noch, wie viele Leute haben nie bemerkt, dass die Funktion zu viele Werte aus dem Array löscht ...

Ich werde eine bessere Alternative für den zweiteiligen Prozess des Abisolierens vorstellen NULL Elemente aus einem Array und Neuindizierung der Schlüssel.

Zunächst ist es jedoch äußerst wichtig, dass ich die gierige Natur von hervorhebe array_filter() und wie dies Ihr Projekt stillschweigend zerstören kann.Hier ist ein Array mit gemischten Werten, das das Problem aufdeckt:

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

Nullwerte werden unabhängig von Groß-/Kleinschreibung entfernt.

Aber schauen Sie sich an, was im Array übrig bleibt, wenn wir es verwenden array_values() & array_filter():

array_values(array_filter($array));

Ausgabearray ($array):

array (
  0 => 'foo',
  1 => 'bar'
)
// All empty, zero-ish, falsey values were removed too!!!

Schauen Sie sich nun an, was Sie mit meiner Methode erhalten array_walk() & ist Null() So generieren Sie ein neues gefiltertes Array:

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

Dies kann zur leichteren Lesbarkeit/Erklärung über mehrere Zeilen geschrieben werden:

array_walk(                      // iterate each element of an input array
    $array,                      // this is the input array
    function($v)use(&$filtered){ // $v is each value, $filter (output) is declared/modifiable
        if(!is_null($v)){        // this literally checks for null values
            $filtered[]=$v;      // value is pushed into output with new indexes
        }
    }
);

Ausgabearray ($filter):

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

Mit meiner Methode erhalten Sie Ihre neu indizierten Schlüssel, alle Nicht-Null-Werte und keinen der Null-Werte.Ein sauberer, tragbarer und zuverlässiger Einzeiler für alle Ihre Array-Nullfilterungsanforderungen.Hier ist ein Demonstration.



Wenn Sie leere, falsche und Null-Elemente (unter Beibehaltung von Nullen) entfernen möchten, funktionieren diese vier Methoden gleichermaßen:

var_export(array_values(array_diff($array,[''])));

oder

var_export(array_values(array_diff($array,[null])));

oder

var_export(array_values(array_diff($array,[false])));

oder

var_export(array_values(array_filter($array,'strlen')));

Ausgabe:

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

Für alle, die die Syntax von Sprachkonstrukten bevorzugen, können Sie schließlich auch einfach qualifizierende Werte in ein neues Array verschieben, um neue Indizes auszugeben.

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

$result = [];
foreach ($array as $value) {
    if (strlen($value)) {
        $result[] = $value;
    }
}

var_export($result);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top