2011-05-06 19 views
12

Estoy buscando una manera de que me mostrara las diferentes propiedades/valores de objetos dados ...comparar las propiedades de objetos y Mostrar diff en PHP

$obj1 = new StdClass; $obj1->prop = 1; 
$obj2 = new StdClass; $obj2->prop = 2; 

var_dump(array_diff((array)$obj1, (array)$obj2)); 
//output array(1) { ["prop"]=> int(1) } 

Esto funciona muy bien, siempre que la propiedad no es una objeto o matriz.

$obj1 = new StdClass; $obj1->prop = array(1,2); 
$obj2 = new StdClass; $obj2->prop = array(1,3); 

var_dump(array_diff((array)$obj1, (array)$obj2)) 
// Output array(0) { } 
// Expected output - array { ["prop"]=> array { [1]=> int(2) } } 

¿Hay alguna manera de deshacerse de esto, incluso cuando la propiedad es otro objeto?

+0

Por lo general se trata este con un método en la clase, como un objeto iguales ($) método ''. Tal vez no puedes modificar la clase? –

+1

Ah, y al comparar propiedades que contienen objetos, ¿cómo considera que los objetos son iguales? Esta es una especie de pregunta recursiva ... Puede verificar si sus propiedades son iguales (problema recursivo ...) o si son la misma instancia (más fuerte que la igualdad). –

+1

es el código por encima del exacto que está probando? si es así, entonces prop de $ obj1 y $ obj2 son la misma matriz (1,2). Técnicamente, realmente no hay diferencia. – dragonjet

Respuesta

4

algo como lo siguiente, que itera a través y hace un diff recursivo es el elemento de la matriz es en sí misma una matriz podría funcionar:

Des trabajo similar a array_diff, pero lo hace una comprobación para ver si es una matriz primero (is_array) y, si es así, establece la diferencia para esa clave para que sea la diferencia para esa matriz. Repite recursivamente

function recursive_array_diff($a1, $a2) { 
    $r = array(); 
    foreach ($a1 as $k => $v) { 
     if (array_key_exists($k, $a2)) { 
      if (is_array($v)) { 
       $rad = recursive_array_diff($v, $a2[$k]); 
       if (count($rad)) { $r[$k] = $rad; } 
      } else { 
       if ($v != $a2[$k]) { 
        $r[$k] = $v; 
       } 
      } 
     } else { 
      $r[$k] = $v; 
     } 
    } 
    return $r; 
} 

A continuación, funciona así:

$obj1 = new StdClass; $obj1->prop = array(1,2); 
$obj2 = new StdClass; $obj2->prop = array(1,3); 
print_r(recursive_array_diff((array)$obj1, (array)$obj2)); 

/* Output: 
    Array 
    (
     [prop] => Array 
      (
       [1] => 2 
      ) 
    ) 
*/ 
+0

esto es casi lo que no quiero , no funciona si $ obj-> prop es otro objeto con una matriz como propiedad ... pero lo mantendré como la mejor respuesta. – nfo

+0

En ese caso, podría agregar en su ciclo algo que compruebe si el objeto está no es una matriz, si puedes convertirla en una y ejecutar recursive_array_diff en ella. –

+0

Algo así como if (is_array ($ v)) {...} elseif (is_array ((array) $ v) {...} else {...} Es posible que deba verificar el número de elementos en el lanzar matriz para comprobar que no estás emitiendo valores accidentalmente. Avísame si trabajas algo :) –

Cuestiones relacionadas