Значения массивов не идентичны (но они?)
У меня есть два массива. Кажется, что они содержат хотя бы один одинаковый набор значений, но выполнение 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() в правильном порядке. Поймал меня несколько раз на этом.