2012-09-20 16 views
10

Tengo dos matrices. Parece que contienen al menos un conjunto idéntico de valores, pero realizar array_diff() no devuelve nada, ¡aunque creo que debería ser así! Esto debería haber sido solo un código de rutina, pero por alguna razón no le gusta lo que hice.Los valores de matrices no son idénticos (¿pero lo son?)

Lo raro es que var_dump($queue[0]); devuelve String(167); y var_dump($videos[0]) devuelve String(168).

Así que, claramente, deben ser diferentes ¿no?

echo similar_text($queue[0]), $videos[0]); devuelve 167. ¿¡Qué!?

Nota: Estos son solo nombres de archivos y no representan el contenido del archivo.

Vídeos matriz

Array ([0] => /var/www/downloads/j2/Dexter Season 1, 2, 3, 4, 5 & 6 + Extras (Early Cuts, Audiobooks etc) DVDRip HDTV TSV/Season 3/Dexter Season 3 Episode 04 - All in the Family.avi)

cola matriz

Array ([0] => /var/www/downloads/j2/Dexter Season 1, 2, 3, 4, 5 & 6 + Extras (Early Cuts, Audiobooks etc) DVDRip HDTV TSV/Season 3/Dexter Season 3 Episode 04 - All in the Family.avi [1] => j2)

salidas

$diff = array_intersect($queue,$videos); print_r($diff);rendimientosArray ()

var_dump($queue[0]); devuelve string(167) "/var/www/downloads/j2/Dexter Season 1, 2, 3, 4, 5 & 6 + Extras (Early Cuts, Audiobooks etc) DVDRip HDTV TSV/Season 3/Dexter Season 3 Episode 04 - All in the Family.avi"

var_dump($videos[0]); devuelvestring(168) "/var/www/downloads/j2/Dexter Season 1, 2, 3, 4, 5 & 6 + Extras (Early Cuts, Audiobooks etc) DVDRip HDTV TSV/Season 3/Dexter Season 3 Episode 04 - All in the Family.avi"

echo similar_text($queue[0], $videos[0]);devuelve167.

He puesto las cadenas en el conteo de caracteres de JavaScript, he usado strlen(), trim() para recortar el espacio en blanco, incluso he contado manualmente cada personaje individualmente. ¿Que esta pasando?

+0

¿Conoces la locura de las conversiones de tipo PHP? Si no, ten cuidado. A veces son endiabladamente difíciles de identificar. – thatidiotguy

+4

Uno de ellos puede contener un carácter no imprimible. Póngalos a ambos en un editor hexadecimal para examinar su contenido completo. –

+0

ha comprobado las terminaciones de línea? \ n vs \ r \ n? –

Respuesta

5

Después de convertir las dos cadenas de formulario utilizando

var_dump(preg_replace_callback('#.#', function($m) { 
    return '\\x' . dechex(ord($m[0])); 
}, $input)) 

hexadecimal escapado-, las cadenas de resultados aparecen así: http://jsfiddle.net/mgaWn/

Mirándolos en esa forma muestra que la primera cadena contiene 5,·6·+·Extras, el segundo uno contiene 5,·6··+·Extras - hay un espacio doble antes del + signo.

HTML colapsa espacios en blanco y esta diferencia se hace completamente invisible. En general, es una buena idea comparar los datos lo más cerca posible de su formato original, antes de que los detalles de formato de salida (como las codificaciones de caracteres o la minimización de espacios en blanco de HTML) se interpongan en su camino.

+0

Brilliant! Y solo un extra adicional para aquellos que insertan cadenas en un DB MySQL que contiene dos o más 'espacios' adyacentes, asegúrese de estar insertando ese valor NO en una columna con el tipo 'VARCHAR', pero en uno con el tipo 'CHAR'. Gracias de nuevo @DCoder! – Jimbo

3

Probablemente haya un carácter que no se puede imprimir.

Escriba ambas cadenas en un archivo, desde PHP, en formato binario, y compare los resultados con un editor hexadecimal o similar. Solo copiar las cadenas y luego comparar no servirá para algunos casos, ya que podría perder caracteres.

+0

Este fue el comienzo de una respuesta correcta, así que gracias por eso, pero DCoder fue el primero en llegar. Todavía te daré un +1 :) – Jimbo

1

Compruebe si las matrices pasadas a array_diff() están en el orden correcto. Me sorprendí algunas veces en esto.

Cuestiones relacionadas