In PHP ist Array_Filter () eine sehr häufige Array -Funktion, mit der Elemente in einem Array basierend auf dem Ergebnis der Rückruffunktion gefiltert werden. Seine Verwendung mag einfach erscheinen, aber viele Entwickler sind durch die "booleale Bedeutung" ihres Rückkehrwerts verwirrt, insbesondere beim Schreiben von Rückruffunktionen.
Zum Beispiel schrieb jemand den folgenden Code:
$input = [0, 1, 2, 3, 4, 5];
$result = array_filter($input, function($value) {
return $value % 2; // Ich hoffe, seltsame Zahlen zu behalten
});
print_r($result);
Sie könnten erwarten, dass die Ausgabe [1, 3, 5] ist, ebenso wie das Ergebnis. Wenn Sie jedoch ein wenig ändern, wird dies leicht zu Verwirrung führen:
$input = [0, 1, 2, 3, 4, 5];
$result = array_filter($input, function($value) {
return $value % 2 == 0; // Ich hoffe, auch Zahlen zu behalten
});
print_r($result);
Viele Leute denken, wenn die Elemente bei der Rückkehr beibehalten werden und wenn sie falsch zurückkehren, werden sie herausgefiltert. Das ist in der Tat wahr. Der Schlüssel ist jedoch, dass - PHP eine dynamisch getippte Sprache ist und jeder von der Rückruffunktion zurückgegebene Wert auf einen booleschen Wert gegossen wird.
Diese Werte in PHP werden in False konvertiert:
Boolescher Wert falsch
Ganzzahl 0
Schwimmender Punkttyp 0.0
Leere Zeichenfolge '' oder '0'
Leeres Array []
NULL
Wenn Sie also den folgenden Code schreiben:
$input = ['a', '', 'b', '0', 'c'];
$result = array_filter($input);
print_r($result);
Sie werden feststellen, dass die Ausgabe lautet:
Array
(
[0] => a
[2] => b
[4] => c
)
Wenn keine Rückruffunktion angegeben ist, verwendet Array_filter () standardmäßig eine boolesche Besetzung, um festzustellen, ob ein Element beibehalten wird. So werden beide leeren Saiten ' und ' 0 ' herausgefiltert - weil sie in Falsch konvertiert werden.
Zu diesem Zeitpunkt werden viele Menschen verwirrt sein: "Ich habe eindeutig Wert, warum wurde es herausgefiltert?"
Weitere Missverständnisse treten normalerweise auf, wenn Entwickler Rückrufe verwenden, um nicht-Boolen-Typen zurückzugeben:
$input = [1, 2, 3, 4, 5, 6];
$result = array_filter($input, function($value) {
return $value & 1; // Verwenden Sie bitweise und urteilen Sie ungerade Zahlen
});
print_r($result);
Dieser Code ist korrekt, aber er kann Anfänger verrückt machen. Das Ergebnis von $ value & 1 beträgt 0 oder 1. Wenn $ value eine gleichmäßige Zahl ist, beträgt das Ergebnis 0 , was in False konvertiert und herausgefiltert wird. Zu diesem Zeitpunkt müssen Sie verstehen, dass der Wert, der 1 oder 0 selbst zurückgibt, feststellt, ob die Elemente beibehalten werden, sondern die Leistung dieser Werte in einer booleschen Umgebung.
Eine andere Sache, die viele Leute nicht bemerkt haben: Array_filter () behält den Schlüsselnamen des ursprünglichen Arrays bei. Wenn Sie den Index wieder aufbauen möchten, können Sie Array_Values () verwenden:
$result = array_values(array_filter($input, function($value) {
return $value > 2;
}));
Beispielsweise möchten Sie Links ohne Token -Parameter aus einer Reihe von URLs herausfiltern:
$urls = [
'https://m66.net/page1?token=abc',
'https://m66.net/page2',
'https://m66.net/page3?token=xyz',
];
$filtered = array_filter($urls, function($url) {
$parts = parse_url($url);
if (!isset($parts['query'])) {
return false;
}
parse_str($parts['query'], $query);
return isset($query['token']);
});
print_r($filtered);
Die Rückruffunktion dieses Codes gibt explizit einen booleschen Wert ( wahr oder falsch ) zurück, damit er nicht durch Typumwandlung verwirrt wird.
Viele Menschen verstehen die "booleale Bedeutung" des Rückrufwerts der Rückruffunktion von Array_Filter () nicht. Letztendlich haben sie kein tiefes Verständnis der "wahren und falschen Werte" in PHP. Denken Sie daran:
Der Rückgabewert der Rückruffunktion wird in einen booleschen Wert konvertiert.
Hängen Sie nicht direkt davon ab, ob ein Typ (z. B. eine Zahl oder eine Zeichenfolge) einen "Wert" hat, sondern explizit True oder False zurückgeben.
Wenn Ihre Absicht ein klares logisches Urteilsvermögen ist, schreiben Sie den booleschen Ausdruck explizit.
Auf diese Weise können Sie diese mächtige und leicht missverstandene Funktion vollständig beherrschen!