2009-10-14 16 views
5

में झूठी रिटर्न देता है यह एक पूरी तरह से मेरे बाहर है। मैं दो तारों की तुलना करने की कोशिश कर रहा हूं। जब मैं उन्हें गूंजता हूं, वे समान होते हैं, फिर भी जब मैं उन्हें '==' ऑपरेटर से तुलना करता हूं, तो यह झूठा होता है। उदाहरण के लिए, मेरे डेटाबेस पर नीचे कोड चलाते समय। यह चीजों को आउटपुट करता है जैसे "ऐप्पल ऐप्पल के बराबर नहीं है"। क्या कोई इस पर प्रकाश डाला सकता है?दो समान स्ट्रिंग की तुलना PHP

if ($this->data['list_text']) { //user has entered into textarea 
      $list = nl2br($this->data['list_text']); 

      $list_array = explode('<br />',$list); 

      $ranking = 1; 
      $company_array = $this->CompanyList->CompanyRanking->Company->find('list',null); 

      //this is the comparison bit 
      foreach ($list_array as $key => $value) { 
       $companyId = null; 
       foreach ($company_array as $key2 => $value2) { 
        if ($value2 != $value) { 
         echo 'APPARENTLY '.$value2.' does not equal '.$value;       
        } else { 
         $companyId = $key2; 
         break; 
        } 
       } 

       $this->data['CompanyRanking'][$ranking]['ranking'] = $ranking; 
       $this->data['CompanyRanking'][$ranking]['company_id'] = $companyId; 
       $ranking++; 
      } 
     } 
+0

strcmp() क्या कहता है? –

उत्तर

2

मैं ओलाफुर से सहमत हूं। मैंने ट्रिम हटा दिया और इसे preg_replace से बदल दिया क्योंकि इस तथ्य के कारण कि आप $ मान मान रहे हैं और $ value2 companyID हैं। गूंज के बजाय

if ($this->data['list_text']) { 
    $list = nl2br($this->data['list_text']); 
    $list_array = explode('<br />', $list); 

    $ranking = 1; 
    $company_array = $this->CompanyList->CompanyRanking->Company->find('list',null); 

    foreach ($list_array as $key => $value) { 

     // remove any non digit characters 
     $value = preg_replace('/[^0-9]/i','', $value); 
     $companyId = null; 

     foreach ($company_array as $key2 => $value2) { 

      // remove any non digit characters 
      $value2 = preg_replace('/[^0-9]/i','', $value2); 

      if ($value2 != $value) { 
       echo 'values not equal';     
      } else { 
       $companyId = $key2; 
       break; 
      } 
     } 

     $this->data['CompanyRanking'][$ranking]['ranking'] = $ranking; 
     $this->data['CompanyRanking'][$ranking]['company_id'] = $companyId; 
     $ranking++; 
    } 
} 
+0

बहुत धन्यवाद cballou। यह पता चला है कि ट्रिम() काम कर रहा था, लेकिन आपका कोड मेरी तुलना में अधिक कुशल था। – gomezuk

3

क्या तारों में कोई अतिरिक्त सफेद जगह है जिसे आप नहीं देख रहे हैं? उन्हें ट्रिम करने का प्रयास करें।

+0

इसी तरह से, 'echo' का उपयोग करने का प्रयास करें> '$ value2।' <बराबर नहीं है> '$ मान।' <';' जो इसे बेहतर तरीके से समझाएगा। –

+0

सुझाव के लिए धन्यवाद। मैंने "अगर (ट्रिम ($ value2)! = ट्रिम ($ मान)) जोड़ने की कोशिश की" और मैं अभी भी "एप्पल एप्पल के बराबर नहीं है" प्राप्त कर रहा हूं। – gomezuk

+0

एक और नोट पर, ऊपर पोस्ट किया गया मेरा कोड तेज़ होगा क्योंकि आप $ company_array के प्रत्येक पुनरावृत्ति के लिए $ मान पर पहली ट्रिम नहीं करते हैं। –

9

कोशिश var_dump(): आप इन पर एक त्वरित संशोधन कर सकते हैं अगर companyID अक्षरांकीय माना जाता है, हाइफ़न, आदि शामिल ... इस संस्करण में यह करना चाहिए।

echo 'APPARENTLY '.$value2.' does not equal '.$value; 
echo '<pre>Debug: '; 
echo 'value='; var_dump($value); 
echo 'value2='; var_dump($value2); 
echo '</pre>'; 

यह अतिरिक्त जानकारी प्रदान करता है। जैसे वास्तविक प्रकार और तारों की लंबाई।

+1

var_dump का उपयोग करते समय विशेष रूप से उपयोगी यह सुनिश्चित करना है कि आपके पास xdebug इंस्टॉल है, क्योंकि यह आउटपुट को काफी बढ़ाएगा (पारंपरिक इको, या, forbid, print_r के साथ चीजों को पढ़ना मुश्किल हो सकता है)। –

2

किसी भी सफेद स्थान के साथ trim() को var_dump() पर देखने के लिए प्रयास करें ताकि यह देखने के लिए कि कुछ और हो रहा है या नहीं।

3

तुलना की तुलना में दोनों स्ट्रिंग के एन्कोडिंग की जांच करने का प्रयास करें।

शायद यह कुछ अजीब वर्णों के साथ आईएसओ -5589-1 की तुलना में utf8 है।

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