【问题标题】:Arrays values not identical (but they are?)数组值不相同(但它们是?)
【发布时间】:2012-09-20 13:42:43
【问题描述】:

我有两个数组。它们似乎包含至少一组相同的值,但执行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() 来修剪空白,我什至还手动单独计算了每个字符。怎么回事?

【问题讨论】:

  • 你知道 PHP 类型转换的疯狂吗?如果没有,请小心。有时它们很难识别。
  • 其中一个可能包含不可打印的字符。将它们都放入十六进制编辑器以检查它们的全部内容。
  • 你检查过行尾吗? \n vs \r\n?
  • 你能说明在通过var_dump(preg_replace_callback('#.#', function($m) { return '\\x' . dechex(ord($m[0])); }, $input)) 运行两个字符串后会发生什么吗?只是为了确保我们看到与您正在测试的完全相同的字节序列,并且不涉及字符编码。
  • 我已将代码中的空格替换为· 以突出显示问题。第一个字符串包含5,·6·+·Extras,第二个字符串包含5,·6··+·Extras - + 符号前有一个双空格。 HTML 会折叠空白并使其变得不可见,这也是我建议转储原始输入而不是依赖复制粘贴输出的原因之一。

标签: php arrays


【解决方案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 空白最小化)妨碍您之前,将数据尽可能接近其原始格式进行比较通常是一个好主意。

【讨论】:

  • 太棒了!对于那些将字符串插入包含两个或更多相邻“空格”的 MySQL DB 来说,只是一个额外的附加功能,请确保将该值插入到类型为 VARCHAR 的列中,而不是类型为 CHAR 的列中。再次感谢@DCoder!
【解决方案2】:

可能有一个不可打印的字符。

将两个字符串从 PHP 中以二进制格式写入一个文件,然后使用十六进制编辑器或类似工具比较结果。在某些情况下,仅复制字符串然后进行比较是行不通的,因为它可能会丢失字符。

【讨论】:

  • 这是一个正确答案的开始,所以谢谢你 - 但 DCoder 首先找到了它的底部。我仍然会给你 +1 :)
【解决方案3】:

检查传递给 array_diff() 的数组的顺序是否正确。在这件事上我被抓了好几次。

【讨论】:

    猜你喜欢
    • 2015-07-14
    • 1970-01-01
    • 2014-06-16
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    • 2021-02-20
    • 1970-01-01
    相关资源
    最近更新 更多