2011-06-24 12 views
21

Sé que hay array_diff y array_udiff para comparar la diferencia entre dos matrices, pero ¿cómo lo haría con dos matrices de objetos?PHP obtener diferencia de dos matrices de objetos

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

Mis matrices son como esta, estoy interesado en ver la diferencia de dos matrices basadas en ID.

Respuesta

53

Esto es exactamente lo que array_udiff es para. Escriba una función que compare dos objetos de la manera que le gustaría, luego diga array_udiff para usar esa función. Algo como esto:

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

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

O, si usted está usando PHP> = 5.3 sólo se puede utilizar un anonymous function en lugar de declarar una función:

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

Su función de comparación no funcionará, una solución rápida sería cambiar el '==' 'a -' . – salathe

+1

Tienes razón, salathe. Fijo. –

+0

Gracias, fue el '-' que me estaba tirando. – roflwaffle

4

Aquí hay otra opción, si desea ejecutar la diferencia según el objeto instancias. Se podría utilizar esto como su devolución de llamada a array_udiff:

function compare_objects($a, $b) { 
    return strcmp(spl_object_hash($a), spl_object_hash($b)); 
} 

Sólo se querrá usar que si está seguro de que las matrices de ambas contienen sólo los objetos - here's my personal use case.

+0

y ¿qué pasa con 'return $ a === $ b? 0: -1'? ¿No haría lo mismo al comparar variables de objetos que apuntan a la misma instancia de objeto? –

1

Y aquí es otra opción si usted quiere comparar las propiedades de cuerda (por ejemplo, nombre):

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