PHP get difference of two arrays of objects
I know there is array_diff
and array_udiff
for comparing the difference between two arrays, but开发者_StackOverflow how would I do it with two arrays of objects?
array(4) {
[0]=>
object(stdClass)#32 (9) {
["id"]=>
string(3) "205"
["day_id"]=>
string(2) "12"
}
}
My arrays are like this one, I am interested to see the difference of two arrays based on IDs.
This is exactly what array_udiff
is for. Write a function that compares two objects the way you would like, then tell array_udiff
to use that function. Something like this:
function compare_objects($obj_a, $obj_b) {
return $obj_a->id - $obj_b->id;
}
$diff = array_udiff($first_array, $second_array, 'compare_objects');
Or, if you're using PHP >= 5.3 you can just use an anonymous function instead of declaring a function:
$diff = array_udiff($first_array, $second_array,
function ($obj_a, $obj_b) {
return $obj_a->id - $obj_b->id;
}
);
Here's another option, if you want to run the diff according to object instances. You would use this as your callback to array_udiff
:
function compare_objects($a, $b) {
return strcmp(spl_object_hash($a), spl_object_hash($b));
}
You'd only want to use that if you're certain that the arrays both contain only objects - here's my personal use case.
And here is another option if you wanna compare string properties (e.g. name):
$diff = array_udiff($first_array, $second_array,
function ($obj_a, $obj_b) {
return strcmp($obj_a->name, $obj_b->name);
}
);
Here is my take on this
/**
* 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;
}
精彩评论