Holen Sie sich die Differenz von zwei Arrays von Objekten

Lesezeit: 4 Minuten

Benutzeravatar von roflwaffle
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?

array(4) {
    [0]=>
        object(stdClass)#32 (9) {
            ["id"]=>
            string(3) "205"
            ["day_id"]=>
            string(2) "12"
        }
}

Meine Arrays sind wie diese, ich bin daran interessiert, den Unterschied zwischen zwei Arrays basierend auf zu sehen id Spaltenwerte.

Benutzeravatar von Jordan Running
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:

function compare_objects($obj_a, $obj_b) {
  return $obj_a->id - $obj_b->id;
}

$diff = array_udiff($first_array, $second_array, 'compare_objects');

Oder wenn Sie PHP >= 5.3 verwenden, können Sie einfach eine verwenden Anonyme Funktion anstatt eine Funktion zu deklarieren:

$diff = array_udiff($first_array, $second_array,
  function ($obj_a, $obj_b) {
    return $obj_a->id - $obj_b->id;
  }
);

  • 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));
}

Sie möchten das nur verwenden, wenn Sie sicher sind, dass die Arrays beide nur Objekte enthalten – Hier ist mein persönlicher Anwendungsfall.

  • 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:

$diff = array_udiff($first_array, $second_array,
  function ($obj_a, $obj_b) {
    return strcmp($obj_a->name, $obj_b->name);
  }
);

Adityas Benutzeravatar
Aditya

Hier ist meine Meinung dazu

/**
     * 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”).

Betrachten Sie diesen Beispieldatensatz:

$array1 = [
    (object) ['id' => '204', 'day_id' => '12'],
    (object) ['id' => '205', 'day_id' => '13'],
    (object) ['id' => '206', 'day_id' => '14'],
    (object) ['id' => '207', 'day_id' => '15'],
];
$array2 = [
    (object) ['id' => '203', 'day_id' => '11'],
    (object) ['id' => '205', 'day_id' => '13'],
    (object) ['id' => '207', 'day_id' => '14'],
    (object) ['id' => '209', 'day_id' => '17'],
];

Die zurückgegebenen Daten von array_udiff() sind die Zeilen aus dem ersten Array, die im zweiten Array nicht übereinstimmen.

Code: (Demo)

var_export(
    array_udiff(
        $array1,
        $array2,
        fn($a, $b) => $a->id <=> $b->id
    )
);

gibt diese beiden Zeilen zurück:

[
    (object) ['id' => '204', 'day_id' => '12'],
    (object) ['id' => '206', 'day_id' => '14'],
]

Reihenfolge der ersten beiden Parameter umkehren: (Demo)

[
    (object) ['id' => '203', 'day_id' => '11'],
    (object) ['id' => '209', 'day_id' => '17'],
)

1449200cookie-checkHolen Sie sich die Differenz von zwei Arrays von Objekten

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy