Aktueller Standort: Startseite> Neueste Artikel> Warum verhalten sich Booleans bei Verwendung der Funktion array_diff () abnormal? Wie lässt es das Boolesche Verhalten abnormal sein?

Warum verhalten sich Booleans bei Verwendung der Funktion array_diff () abnormal? Wie lässt es das Boolesche Verhalten abnormal sein?

M66 2025-06-06

Bei der täglichen PHP -Programmierung ist Array_Diff () eine sehr praktische Funktion, mit der der Unterschied zwischen zwei Arrays ermittelt werden kann. Viele Entwickler können jedoch auf eine seltsame Situation stoßen, wenn sie diese Funktion verwenden:

Was ist los? Lassen Sie uns gemeinsam die Gründe untersuchen.

1. Einfaches Beispiel: Ausnahmeverhalten von Booleschen Werten

Schauen wir uns den folgenden Code an:

 $a = [true, false];
$b = [0];

$result = array_diff($a, $b);
print_r($result);

Sie könnten intuitiv denken, dass True und False nicht im Array $ B sind, daher sollte $ Ergebnis [wahr, falsch] sein, aber Sie erhalten tatsächlich die folgende Ausgabe:

 Array
(
    [0] => 1
)

Bist du ein wenig verwirrt? Warum ist falsch gefiltert? Und wahr wird auch eine Ganzzahl 1 ? Lassen Sie uns dieses Problem allmählich zerlegen.

2. Wie Array_Diff () funktioniert

Zunächst müssen wir das zugrunde liegende Verhalten von array_diff () verstehen. Nach den Anweisungen der offiziellen PHP -Dokumentation :

Array_Diff () verwendet "Nicht-Strengvergleich" (==), um zu überprüfen, ob die Werte gleich sind.

Das heißt, Array_Diff () verwendet kongruent ==, um Werte zu vergleichen, sondern doppelt gleiches Zeichen == .

Dies bedeutet, dass die folgenden Werte als "gleich" angesehen werden:

 false == 0;       // true
true == 1;        // true
true == "1";      // true
false == "";      // true

In unserem Beispiel wird False nach 0 gleich beurteilt und daher von Array_Diff () aus dem Ergebnis ausgeschlossen.

3. Die Booleschen Werte werden automatisch in den Typ konvertiert

Ein weiteres Detail ist, dass das von array_diff () zurückgegebene Array ein Array von numerischen Werten ist und PHP in einigen Fällen die Booleschen Werte implizit konvertieren. Zum Beispiel:

 var_dump(true);  // Ausgabe bool(true)
echo true;       // Ausgabe 1

Bei Ausgabe in print_r () wird der boolean true in 1 konvertiert. Deshalb werden Sie sehen, wie ich im Ergebnis erscheinen, nicht wahr .

4. Wie vermeiden Sie dieses Problem?

Wenn Sie die Datentypen vergleichen müssen (z. B. müssen Sie wirklich zwischen True und 1 unterscheiden), können Sie Array_udiff () verwenden und mit einer benutzerdefinierten Vergleichsfunktion zusammenarbeiten:

 $a = [true, false];
$b = [0];

$result = array_udiff($a, $b, function($x, $y) {
    return ($x === $y) ? 0 : 1;
});

print_r($result);

Ausgabe:

 Array
(
    [0] => 1
    [1] => 
)

Beachten Sie, dass FALSE (der entsprechende Wert leer ist) diesmal ebenfalls erhalten bleibt, da wir kongruentes Vergleich === verwendet haben.

Wenn Sie diese Werte klarer unterscheiden und die Darstellung des Booleschen Typs beibehalten müssen, können Sie var_export () kombinieren, um das Ergebnis auszugeben:

 var_export($result);

5. Schlussfolgerung: Gehen Sie mit Vorsicht und nicht strengen Vergleich

Obwohl das Standardverhalten von Array_Diff () in vielen Szenarien sehr effizient ist, ist es einfach, verwirrende Ergebnisse zu erzielen, wenn es um Arrays von booleschen Werten, Zahlen und Zeichenfolgen geht. Dies ist auch eine typische Falle, die durch die Schwächung des Typs in PHP verursacht wird.

Wenn Sie in der Entwicklung strenge Anforderungen an Datentypen haben, vermeiden Sie die Verwendung der Standard -Array_Diff () und stattdessen Array_udiff () und geben Sie Ihre eigene Vergleichsfunktion an, es ist ein sicherer und zuverlässigerer Ansatz.