Значения массивов не идентичны (но они?)

У меня есть два массива. Кажется, что они содержат хотя бы один одинаковый набор значений, но выполнение array_diff() не возвращает ничего, хотя я думаю, что это нужно! Это должен был быть обычный рутинный код, но по какой-то причине ему не нравится то, что я сделал.

Странно то, что var_dump($queue[0]); возвращает String(167); и var_dump($videos[0]) возвращает String(168).

Так ясно, что они должны быть разными?

echo similar_text($queue[0]), $videos[0]); возвращает 167. Что!?

Примечание. Это просто имена файлов и не представляют содержимое файла.

Видео Массив

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 )

Массив очереди

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 )

Результаты

$diff = array_intersect($queue,$videos); print_r($diff); возвращает Array ( )

var_dump($queue[0]); возвращает 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]); возвращает string(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]); возвращает 167.

Я поместил строки в число символов JavaScript, я использовал strlen(), trim() для обрезания пробелов, даже вручную подсчитывал каждый символ в отдельности. Что происходит?

Ответ 1

После преобразования обеих строк в гекс-экранированную форму с помощью

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

строки результатов выглядят следующим образом: http://jsfiddle.net/mgaWn/

Глядя на них в этой форме, показывает, что первая строка содержит 5,·6·+·Extras, вторая содержит 5,·6··+·Extras - там двойное пространство перед знаком +.

HTML сворачивает пробелы, и эта разница становится полностью невидимой. Как правило, рекомендуется сравнить данные как можно ближе к исходному формату, до того, как на вашем пути появятся какие-либо особенности выходного формата (такие как кодировка символов или эта минимизация пробелов HTML).

Ответ 2

Возможно, существует символ, который не может быть распечатан.

Выпишите обе строки в файл, из PHP, в двоичном формате и сравните результаты с шестнадцатеричным редактором или аналогичным. Просто копирование строк, а затем сравнение не будет выполняться в некоторых случаях, так как оно может потерять символы.

Ответ 3

Проверьте, соответствуют ли массивы массиву array_diff() в правильном порядке. Поймал меня несколько раз на этом.