2009-10-14 67 views
5

Cái này hoàn toàn nằm ngoài tôi. Tôi đang cố gắng so sánh hai chuỗi. Khi tôi lặp lại chúng, chúng dường như giống hệt nhau, nhưng khi tôi so sánh chúng với toán tử '==', nó trả về false. Ví dụ, khi chạy mã dưới đây trên cơ sở dữ liệu của tôi. Nó đưa ra những thứ như "APPARENTLY Apple không bằng Apple". bất cứ ai có thể rụng bất kỳ ánh sáng về điều này?So sánh hai chuỗi giống hệt nhau trả về false trong 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() nói gì? –

Trả lời

2

Tôi đồng ý với Olafur. Tôi loại bỏ trim và thay thế nó bằng một preg_replace do thực tế bạn đang giả định $ value và $ value2 là companyIDs. Bạn có thể sửa đổi nhanh chóng những điều này nếu companyID được cho là chữ và số, chứa dấu gạch nối, v.v. Phiên bản này nên làm điều đó:

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

Rất cám ơn cballou. Nó chỉ ra trim() đã được làm việc, nhưng mã của bạn đã được nhiều hơn nữa hiệu quả hơn tôi. – gomezuk

3

Chuỗi có bất kỳ khoảng trắng thừa nào mà bạn không nhìn thấy không? Hãy thử cắt tỉa chúng.

+0

Trong một mạch tương tự, hãy thử sử dụng 'echo 'APPARENTLY>'. $ Value2. ''. $ Value. '<';' Cũng sẽ minh họa điều này tốt hơn. –

+0

Cảm ơn đề xuất. Tôi đã thử thêm "if (trim ($ value2)! = Trim ($ value))" và tôi vẫn nhận được "APPARENTLY Apple không bằng Apple". – gomezuk

+0

Trên một lưu ý khác, mã của tôi được đăng ở trên sẽ nhanh hơn khi bạn không thực hiện lần cắt đầu tiên trên giá trị $ cho mỗi lần lặp của $ company_array. –

9

Hãy thử var_dump() thay vì echo.

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

Nó cung cấp thông tin bổ sung. Ví dụ. loại thực tế. Và độ dài của chuỗi.

+1

Đặc biệt hữu ích khi sử dụng var_dump là để đảm bảo bạn đã cài đặt xdebug, vì nó sẽ làm tăng đầu ra (mọi thứ có thể khó đọc với echo truyền thống, hoặc, cấm, print_r). –

2

thử trim() cho bất kỳ khoảng trắng nào cũng như var_dump() để xem có bất kỳ thứ gì khác đang được chuyển cùng với không.

3

Hãy thử kiểm tra mã hóa của cả hai chuỗi so sánh.

có thể là utf8 so với iso-5589-1 với một số ký tự lạ.

Các vấn đề liên quan