2012-08-17 14 views
10

Este es un problema tan simple, pero el documento PHP no explica por qué está sucediendo.PHP array_diff weirdness

tengo este código:

var_dump($newattributes); var_dump($oldattributes); 
var_dump(array_diff($newattributes, $oldattributes)); 

Para briefity voy a omitir grandes partes de la estructura en realidad estoy usando (ya que cada uno es 117 elementos de longitud) y se corta para el caso.

Tengo una matriz llamada $newattributes que se parece a:

array(117){ 
    // Lots of other attributes here 
    ["deleted"] => int(1) 
} 

y otro llamado $oldattributes que se parece a:

array(117){ 
    // Lots of other attributes here 
    ["deleted"] => string(1) "0" 
} 

¿Qué se ve diferente ¿verdad? De acuerdo con array_diff: no. La salida que recibo de array_diff es:

array(0) { } 

He leído la página de documentación sin embargo, dice:

Dos elementos son considerados iguales si y sólo si (string) $ elem1 === (cadena) $ elem2. En palabras: cuando la representación de cadena es la misma.

Y no estoy seguro de cómo "1" puede oponerse a "0".

¿Estoy viendo alguna advertencia con array_diff que no tomé en consideración?

+3

Buena pregunta, claro, bien pedido y no demasiado largo y demasiado código. ¡Más personas deberían hacerlo así! +1 – Hidde

+2

Esto no debería suceder, y de hecho [no sirve para mí] (http://ideone.com/jDeUd). – Jon

+0

@Jon Gracias por la prueba, voy a mirar más en mi compilación de PHP – Sammaye

Respuesta

11

El problema podría residir en el hecho de que está utilizando matrices asociativas: usted debe tratar de usar lo siguiente para matrices asociativas: array_diff_assoc():

<?php 
    $newattributes = array(
     "deleted" => 1 
    ); 

    $oldattributes = array(
     "deleted" => "0" 
    ); 

    $result = array_diff_assoc($newattributes, $oldattributes); 

    var_dump($result); 
?> 

resultado:

array(1) { 
     ["deleted"]=> 
     int(1) 
    } 
+0

Sí que funcionó, wow eso es una locura – Sammaye

+0

eres bienvenido :) PHP es un lenguaje muy indulgente, conocer las funciones correctas a veces suele ser el truco correcto. – DonSeba

+0

+1. Tienes una impresionante presencia de la mente. ¡Conjuntos asociativos! – Karma

2

Se qué suceda a mí también (cuando hay más valores de uno)

$new = array('test' => true, 'bla' => 'test' 'deleted' => 1); 
$old = array('test' => true, 'deleted' => '0'); 

Para una completa array_diff lo necesario para hacer un trabajo extra, ya que en su defecto se devuelve un relative complement

Prueba esto:

array_diff(array_merge($new, $old), array_intersect($new, $old)) 

Resultado:

Array 
(
    [bla] => test 
    [deleted] => 0 
) 
+0

De hecho que funciona gracias, he tomado la otra respuesta como la marcada ya que no necesita la fusión o intersección, pero +1 para ser el primero con una matemática funcional y de respaldo, esto es prolly lo que hace PHP al comparar assoc – Sammaye

+0

Ese trabajo alrededor hace lo mismo que: array_diff_assoc(). gran hallazgo sin embargo :) +1 – DonSeba

+0

Sí, 'array_diff_assoc' obviamente es mucho más fácil, no lo sabía. SO es una gran herramienta para aprender cosas adicionales :) –