2012-09-20 12 views
10

मेरे पास दो सरणी हैं। उनमें कम से कम एक समान मूल्य शामिल होते हैं, लेकिन array_diff() प्रदर्शन कुछ भी वापस नहीं करता है, भले ही मुझे लगता है कि यह चाहिए! यह सिर्फ नियमित कोड होना चाहिए था लेकिन किसी कारण से यह मेरे द्वारा किए गए कार्यों को पसंद नहीं करता है।Arrays मान समान नहीं हैं (लेकिन वे हैं?)

अजीब बात यह है कि 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

मैंने तारों को जावास्क्रिप्ट चरित्र गणना में डाल दिया है, मैंने स्ट्रेटेन(), ट्रिम() का उपयोग व्हाइटस्पेस को ट्रिम करने के लिए किया है, मैंने मैन्युअल रूप से प्रत्येक चरित्र को मैन्युअल रूप से गिना है। क्या चल रहा है?

+0

क्या आप PHP प्रकार रूपांतरणों की पागलपन से अवगत हैं? यदि नहीं, सावधान रहें। वे कभी-कभी पहचानने के लिए शैतानी रूप से मुश्किल होते हैं। – thatidiotguy

+4

उनमें से एक में एक गैर-प्रिंट करने योग्य चरित्र हो सकता है। उन्हें अपनी पूरी सामग्री की जांच करने के लिए दोनों को हेक्स संपादक में रखें। –

+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, दूसरा होता है एक में 5,·6··+·Extras - + साइन से पहले एक डबल स्पेस है।

एचटीएमएल खाली स्थान के गिर और इस अंतर को पूरी तरह से अदृश्य हो जाता है। किसी भी आउटपुट प्रारूप विनिर्देशों (जैसे चरित्र एन्कोडिंग या यह HTML व्हाइटस्पेस न्यूनतमकरण) आपके रास्ते में आने से पहले डेटा को तुलनात्मक रूप से अपने मूल प्रारूप के करीब तुलना करना एक अच्छा विचार है।

+0

शानदार! और केवल दो या अधिक आसन्न 'रिक्त स्थान' वाले एक MySQL डीबी में स्ट्रिंग डालने वाले लोगों के लिए अतिरिक्त जोड़ा गया है, सुनिश्चित करें कि आप उस मान को 'VARCHAR' प्रकार वाले कॉलम में नहीं डाल रहे हैं, लेकिन एक प्रकार' CHAR' के साथ। फिर से धन्यवाद @ डीकोडर! – Jimbo

3

शायद एक ऐसा चरित्र है जो गैर-प्रिंट करने योग्य है।

दोनों स्ट्रिंग्स को PHP में, बाइनरी प्रारूप में, और हेक्स संपादक या इसी तरह के परिणामों की तुलना करें। बस तारों की प्रतिलिपि बनाना और फिर तुलना करना कुछ मामलों के लिए नहीं होगा क्योंकि यह अक्षर खो सकता है।

+0

यह एक सही उत्तर की शुरुआत थी, इसलिए इसके लिए धन्यवाद - लेकिन डीसीओडर पहले इसके नीचे पहुंच गया। मैं अभी भी आपको एक +1 दूंगा :) – Jimbo

1

जांचें कि सरणी_diff() पर दिए गए सरणी सही क्रम में हैं या नहीं। इस पर कुछ बार खुद को पकड़ा।

संबंधित मुद्दे

 संबंधित मुद्दे