10

2つのアレイがあります。それらには少なくとも1つの同一の値のセットが含まれているように見えますが、実行 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()を使用して空白を削除し、手動で各文字を個別に数えました。どうしたの?

4

3 に答える 3

5

を使用して両方の文字列を16進エスケープ形式に変換した後

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

、結果の文字列は次のように表示されます:http: //jsfiddle.net/mgaWn/

その形式でそれらを見ると、最初の文字列にはが含まれ5,·6·+·Extras、2番目の文字列にはが含まれていることがわかります5,·6··+·Extras-記号の前に二重のスペースがあり+ます。

HTMLは空白を折りたたむため、この違いは完全に見えなくなります。一般に、出力形式の詳細(文字エンコードやこのHTML空白の最小化など)が邪魔になる前に、データをできるだけ元の形式に近づけて比較することをお勧めします。

于 2012-09-20T14:38:12.777 に答える
3

印刷できない文字が含まれている可能性があります。

両方の文字列をPHPからバイナリ形式でファイルに書き出し、その結果を16進エディタなどと比較します。文字列をコピーしてから比較するだけでは、文字が失われる可能性があるため、場合によっては機能しません。

于 2012-09-20T14:01:43.607 に答える
1

array_diff()に渡された配列が正しい順序であるかどうかを確認します。これに何度か気づきました。

于 2012-09-20T14:12:38.870 に答える