2012-09-20 14 views
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()を使って空白を整えました。手動で各文字を手動で数えました。どうしたの?

+0

あなたはPHP型変換の狂気に気づいていますか?そうでない場合は注意してください。彼らはときどき識別するのが難しいです。 – thatidiotguy

+4

そのうちの1つに印刷できない文字が含まれている可能性があります。それらを両方ともヘキサエディタに入れ、完全な内容を調べます。 –

+0

行末をチェックしましたか? \ n対\ r \ n? –

答えて

5

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

を使用して、両方の文字列を変換するために六角エスケープ形式後、結果文字列は次のように表示されます。その形でそれらを見てhttp://jsfiddle.net/mgaWn/

は、第二の、第一列は5,·6·+·Extrasが含まれていることを示しています1つには5,·6··+·Extras - が含まれています。+の前にダブルスペースがあります。です。

HTMLは空白を崩壊させ、この違いは完全に見えなくなります。出力形式の詳細(文字エンコーディングやHTML空白最小化など)が得られる前に、可能な限り元の形式に近いデータを比較することは、一般的には良い考えです。

+0

ブリリアント! 2つ以上の隣接する 'スペース'を含むMySQL DBに文字列を挿入する場合は、 'VARCHAR'型の列には挿入せず、' CHAR'型の列のみに挿入するようにしてください。再度ありがとう@DCoder! – Jimbo

3

おそらく、印刷できない文字があります。

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

+0

これは正解の始まりでした。だからこそ感謝します。しかし、DCoderはまずそれの底に達しました。私はまだあなたに+1を与えるでしょう:) – Jimbo

1

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

関連する問題