In PHP ist Array_filter () eine sehr häufige Funktion, mit der Elemente in einem Array gefiltert werden können. Diese Funktion akzeptiert ein Array und eine Rückruffunktion (die Standard -Boolean -Transformation wird verwendet, wenn kein Rückruf vorliegt), und gibt ein neues Array zurück, das nur Elemente enthält, die den Bedingungen erfüllen. Obwohl Array_Filter () im Umgang mit einfachen eindimensionalen Arrays sehr effektiv ist, scheint es, wenn wir verschachtelte Arrays verarbeiten. Warum können Arrays nicht array_filter () verschachtelt werden? Wie können wir dieses Problem lösen? Lassen Sie uns unten eingehend diskutieren.
Die ursprüngliche Absicht von Array_Filter () besteht darin, eindimensionale Arrays zu filtern. Es verarbeitet die Subtarrays eines Arrays nicht rekursiv. Das heißt, Array_Filter () wendet nur eine Rückruffunktion auf die Elemente des Arrays der obersten Ebene an und ignoriert die Elemente im verschachtelten Array vollständig. Wenn ein Array verschachtelte Arrays enthält, kann Array_Filter () in diesen verschachtelten Arrays Elemente nicht effektiv filtern.
Zum Beispiel:
$array = [
1,
2,
[3, 4],
5,
[6, 7]
];
$result = array_filter($array, function($value) {
return $value > 3;
});
print_r($result);
Die Ausgabe wird sein:
Array
(
[1] => 2
[3] => Array
(
[0] => 3
[1] => 4
)
[4] => Array
(
[0] => 6
[1] => 7
)
)
Wie Sie sehen können, werden verschachtelte Arrays [3, 4] und [6, 7] nicht gefiltert, sondern im Ergebnis gehalten, wie es ist. Dies liegt daran, dass Array_Filter () nicht rekursiv das verschachtelte Array eingibt.
Die einfachste Lösung für das Filterschachtel Arrays ist die Verwendung von Rekursion. Durch Aufrufen von Array_Filter () können wir sicherstellen, dass jedes Element im verschachtelten Array verarbeitet werden kann.
Hier finden Sie eine Implementierung der rekursiven Filterung:
function array_filter_recursive($array, $callback) {
return array_map(function($value) use ($callback) {
if (is_array($value)) {
return array_filter_recursive($value, $callback); // Rekursiv auf verschachtelte Arrays rufen
} else {
return $callback($value) ? $value : null; // Filter einzelner Elemente
}
}, $array);
}
$array = [
1,
2,
[3, 4],
5,
[6, 7]
];
$result = array_filter_recursive($array, function($value) {
return $value > 3;
});
print_r($result);
Das Ausgabeergebnis wird:
Array
(
[1] =>
[2] => Array
(
[1] => 4
)
[3] =>
[4] => Array
(
[0] => 6
[1] => 7
)
)
Wie Sie sehen können, wird jedes Element im Array gefiltert und die Elemente im verschachtelten Array korrekt gefiltert.
Array_Filter_Recursive () durchquert das Array rekursiv mit Array_Map () . Überprüfen Sie für jedes Element, ob es sich um ein Array handelt. Wenn es sich um ein Array handelt, wird Array_filter_Recursive () rekursiv angewendet. Wenn es sich um einen einzelnen Wert handelt, wird die Rückruffunktion auf den Filter angewendet.
In dieser Implementierung wird der Nullwert herausgefiltert. Sie können das Verhalten der Rückruffunktion entsprechend den tatsächlichen Anforderungen anpassen und entscheiden, wie gefilterte Elemente umgehen.
Array_Filter () selbst kann nur eindimensionale Arrays filtern und keine verschachtelten Arrays verarbeiten. Durch rekursives Aufrufen von Array_filter () oder ähnlichen benutzerdefinierten Funktionen können wir problemlos eine effiziente Filterung verschachtelter Arrays ausführen. Abhängig von Ihren Anforderungen können Sie auch die Logik der Rückruffunktion ändern, um sie flexibler zu gestalten und sich an verschiedene Szenarien anzupassen.