Holen Sie sich die Differenz von zwei Arrays von Objekten
Lesezeit: 4 Minuten
roflwaffel
Ich weiß, dass es das gibt array_diff Und array_udiff um den Unterschied zwischen zwei Arrays zu vergleichen, aber wie würde ich es mit zwei Arrays von Objekten machen?
Meine Arrays sind wie diese, ich bin daran interessiert, den Unterschied zwischen zwei Arrays basierend auf zu sehen id Spaltenwerte.
Jordan läuft
Das ist genau das, was array_udiff ist für. Schreiben Sie eine Funktion, die zwei Objekte so vergleicht, wie Sie es möchten, und teilen Sie sie dann mit array_udiff um diese Funktion zu verwenden. Etwas wie das:
Ihre Vergleichsfunktion wird nicht funktionieren, eine schnelle Lösung wäre, die zu ändern == Zu -.
– Salat
24. Juni 2011 um 18:56 Uhr
Du hast recht, Salathe. Fest.
– Jordan Running
24. Juni 2011 um 19:05 Uhr
Danke, es war die - das hat mich abgeschreckt.
– Roflwaffel
25. Juni 2011 um 0:04 Uhr
Hinweis: ein vergleiche_objekte, können Sie 0 zurückgeben, um zu sagen, dass die Objekte gleich sind. und -1, um zu sagen, dass sie unterschiedlich sind.
– Francisco Corrales Morales
11. März 2015 um 17:29 Uhr
Die Interna dieser Funktion scheinen eine Sortierung zu verwenden, sodass Sie wirklich -1 oder 1 zurückgeben müssen, wenn die Objekte nicht gleich sind, daher ist der Kommentar von @FranciscoCorralesMorales nicht korrekt.
– fietserwin
7. Juni 2018 um 8:16 Uhr
Hier ist eine weitere Option, wenn Sie den Diff nach Objekt ausführen möchten Instanzen. Sie würden dies als Ihren Rückruf verwenden array_udiff:
function compare_objects($a, $b) {
return strcmp(spl_object_hash($a), spl_object_hash($b));
}
und was ist mit return $a === $b ? 0 : -1 ? Würde es nicht dasselbe tun, indem es Objektvariablen vergleicht, die auf dieselbe Objektinstanz zeigen?
– Dimitri K
7. April 2017 um 10:39 Uhr
Die Interna dieser Funktion scheinen eine Sortierung zu verwenden, sodass Sie wirklich -1 oder 1 zurückgeben müssen, wenn die Objekte nicht gleich sind, sodass der Kommentar von @ Dimitry K nicht korrekt ist.
– fietserwin
7. Juni 2018 um 8:17 Uhr
Und hier ist eine weitere Option, wenn Sie Zeichenfolgeneigenschaften (z. B. Name) vergleichen möchten:
/**
* Compare two objects (active record models) and return the difference. It wil skip ID from both objects as
* it will be obviously different
* Note: make sure that the attributes of the first object are present in the second object, otherwise
* this routine will give exception.
*
* @param object $object1
* @param object $object2
*
* @return array difference array in key-value pair, empty array if there is no difference
*/
public static function compareTwoObjects($object1, $object2)
{
$differences=[];
foreach($object1->attributes as $key => $value) {
if($key =='id'){
continue;
}
if($object1->$key != $object2->$key){
$differences[$key] = array(
'old' => $object1->$key,
'new' => $object2->$key
);
}
}
return $differences;
}
Sie haben zwei Arrays mit Objekten – using array_udiff() ist für diese Aufgabe sicherlich geeignet.
Ich demonstriere diese Technik mit moderner Syntax (“Raumschiffoperator” und “Pfeilfunktionssyntax”).