In PHP wird die Funktion array_diff () verwendet, um zwei oder mehr Arrays zu vergleichen, die Elemente zurückgeben, die im ersten Array vorhanden sind, jedoch nicht in anderen Arrays. Normalerweise wird es verwendet, um einfache Arrays zu handhaben, aber das Problem wird etwas komplizierter, wenn wir auf Arrays von Objekten stoßen. Kann array_diff () Objektarrays also verwandeln? Wenn nicht, wie kann man ähnliche Funktionen implementieren? In diesem Artikel wird es ausführlich vorgestellt.
Die grundlegende Verwendung der Funktion array_diff () besteht darin, Elemente zwischen Arrays zu vergleichen und diejenigen zurückzugeben, die nur im ersten Array erscheinen. Die Funktionssignatur ist wie folgt:
array_diff(array $array1, array $array2, array ...$arrays): array
Diese Funktion enthält zwei oder mehr Arrays als Parameter und gibt die eindeutigen Elemente im ersten Array zurück. Hier ist ein einfaches Beispiel:
$array1 = [1, 2, 3, 4];
$array2 = [3, 4, 5, 6];
$result = array_diff($array1, $array2);
print_r($result);
Ausgabe:
Array
(
[0] => 1
[1] => 2
)
Die Funktion array_diff () funktioniert basierend auf "Wertvergleich", was bedeutet, dass der Operator == Elemente in einem Array verglichen wird. Für Objektarrays kann Array_Diff () nicht direkt wie normale Arrays verglichen werden. Objekte sind Referenztypen in PHP, daher betrachtet Array_diff () sie als unterschiedliche Objekte, selbst wenn die Attributwerte von Objekten gleich sind.
Nehmen wir beispielsweise an, wir haben zwei Arrays von Objekten mit demselben Inhalt, aber sie sind unterschiedliche Objektinstanzen:
class Person {
public $name;
public $age;
public function __construct($name, $age) {
$this->name = $name;
$this->age = $age;
}
}
$obj1 = new Person('John', 30);
$obj2 = new Person('John', 30);
$obj3 = new Person('Jane', 25);
$array1 = [$obj1, $obj2];
$array2 = [$obj2, $obj3];
$result = array_diff($array1, $array2);
print_r($result);
Ausgabe:
Array
(
[0] => Person Object
(
[name] => John
[age] => 30
)
)
Obwohl die Attributwerte von $ OBJ1 und $ OBJ2 gleich sind, berücksichtigt Array_Diff () sie anders, weil es sich um unterschiedliche Objektinstanzen handelt. Daher gibt es $ obj1 zurück, ohne ein Objekt mit demselben Attributwert zurückzugeben.
Um Arrays von Objekten mit Array_Diff () zu vergleichen, können wir dieses Problem lösen, indem wir benutzerdefinierte Vergleichsregeln implementieren. Eine gemeinsame Methode besteht darin, die Funktion array_map () zu verwenden, um Objekte in Arrays umzuwandeln und deren Attributwerte zu vergleichen.
Hier ist eine Lösung, die auf array_map () basiert, die durch Konvertieren von Objekten in Attribut -Arrays vergleicht wird:
class Person {
public $name;
public $age;
public function __construct($name, $age) {
$this->name = $name;
$this->age = $age;
}
// In ein Array konvertieren,Bequemer Vergleich
public function toArray() {
return ['name' => $this->name, 'age' => $this->age];
}
}
$obj1 = new Person('John', 30);
$obj2 = new Person('John', 30);
$obj3 = new Person('Jane', 25);
$array1 = [$obj1, $obj2];
$array2 = [$obj2, $obj3];
// verwendenarray_map将对象In ein Array konvertieren
$array1 = array_map(function($obj) {
return $obj->toArray();
}, $array1);
$array2 = array_map(function($obj) {
return $obj->toArray();
}, $array2);
// verwendenarray_diffEinen Vergleich machen
$result = array_diff($array1, $array2);
print_r($result);
Ausgabe:
Array
(
[0] => Array
(
[name] => John
[age] => 30
)
)
In diesem Beispiel fügen wir der Personklasse eine toArray () -Methode hinzu, um die Eigenschaften des Objekts in ein Array umzuwandeln. Verwenden Sie dann array_map () , um das Objektarray in ein Attribut -Array zu konvertieren und zu vergleichen. Auf diese Weise können Sie Objekt -Arrays nach Wert vergleichen.
Die Funktion array_diff () kann das Objektarray nicht direkt verarbeiten, da es auf Wertvergleiche basiert, und Objekte sind Referenztypen in PHP. Wenn Sie Arrays von Objekten vergleichen müssen, können Sie Objekte nach benutzerdefinierten Konvertierungsregeln in Arrays konvertieren und deren Attributwerte vergleichen. Die Methoden array_map () und toArray () sind eine gemeinsame Lösung.
Auf diese Weise können wir Objektarrays flexibel vergleichen und Funktionen implementieren, die ähnlich wie bei array_diff () sind.