2012-09-20 10 views
10

Ich habe zwei Arrays. Sie scheinen mindestens eine identische Menge von Werten zu enthalten, aber die Ausführung array_diff() gibt nichts zurück, obwohl ich denke, dass es sollte! Dies sollte nur Routine-Code gewesen sein, aber aus irgendeinem Grund mag es nicht, was ich getan habe.Array-Werte nicht identisch (aber sie sind?)

Die seltsame Sache ist, dass var_dump($queue[0]);String(167); zurückgibt und var_dump($videos[0])String(168) zurückgibt.

Also klar, müssen sie anders sein, oder?

echo similar_text($queue[0]), $videos[0]); gibt 167 zurück. Was!?

Hinweis: Dies sind nur Dateinamen und repräsentieren nicht den Inhalt der Datei.

Videos Array

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)

Queue Array

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)

Ausgänge

$diff = array_intersect($queue,$videos); print_r($diff);kehrtArray ()

var_dump($queue[0]); kehrt 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]); kehrtstring(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]);kehrt167.

Ich habe die Zeichenfolgen in JavaScript-Zeichen zählt, ich habe Strlen(), trim() verwendet, um Whitespace zu trimmen, ich habe sogar jedes Zeichen einzeln manuell gezählt. Was ist los?

+0

Sind Sie sich der Irrsinnigkeit von PHP-Typkonvertierungen bewusst? Wenn nicht, pass auf. Sie sind manchmal teuflisch schwer zu erkennen. – thatidiotguy

+4

Einer von ihnen enthält möglicherweise ein nicht druckbares Zeichen. Setze sie beide in einen Hex-Editor, um ihren gesamten Inhalt zu untersuchen. –

+0

Haben Sie Zeilenenden überprüft? \ n vs \ r \ n? –

Antwort

5

Nachdem beide Strings Umwandlung verhexen entkam Form mit

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

erscheinen die Ergebnisstrings wie folgt aus: http://jsfiddle.net/mgaWn/

Blick auf sie in dieser Form zeigt, dass die erste Zeichenfolge enthält 5,·6·+·Extras, die zweite eins enthält 5,·6··+·Extras - Es gibt einen doppelten Platz vor dem + Zeichen.

HTML reduziert Leerzeichen und dieser Unterschied wird vollständig unsichtbar. Es ist im Allgemeinen eine gute Idee, die Daten so nahe wie möglich an ihr ursprüngliches Format zu vergleichen, bevor irgendwelche Ausgabeformatspezifikationen (wie Zeichenkodierungen oder diese HTML-Leerraumminimierung) Ihnen in den Weg kommen.

+0

Brilliant! Und nur ein zusätzliches Extra für diejenigen, die Zeichenfolgen in eine MySQL DB einfügen, die zwei oder mehr benachbarte "Leerzeichen" enthält, stellen Sie sicher, dass Sie diesen Wert NICHT in eine Spalte mit dem Typ 'VARCHAR' einfügen, sondern in eine mit dem Typ' CHAR'. Nochmals vielen Dank @DCoder! – Jimbo

3

Es gibt wahrscheinlich ein Zeichen, das nicht druckbar ist.

Schreiben Sie beide Strings in eine Datei, aus PHP, im Binärformat, und vergleichen Sie die Ergebnisse mit einem Hex-Editor oder ähnlichem. Das Kopieren der Strings und das anschließende Vergleichen ist in einigen Fällen nicht möglich, da sonst Zeichen verloren gehen könnten.

+0

Das war der Anfang einer richtigen Antwort, also danke dafür - aber DCoder ging zuerst auf den Grund. Ich gebe dir immer noch ein +1 :) – Jimbo

1

Überprüfen Sie, ob an array_diff() übergebene Arrays in der richtigen Reihenfolge sind. Fing mich einige Male daran.

Verwandte Themen