2012-02-13 58 views
6

Tôi đang làm việc trên một số mã phân tích cú pháp dữ liệu trong khi tôi đi qua những điều sau đây.So sánh và so sánh số nguyên chuỗi PHP Weird

$line = "100 something is amazingly cool"; 
$key = 100; 

var_dump($line == $key); 

Vâng hầu hết chúng ta mong chờ bãi để sản xuất một false, nhưng trước sự ngạc nhiên của tôi bãi là một true!

Tôi hiểu rằng trong PHP có loại chuyển đổi như thế:

$x = 5 + "10 is a cool number"; // as documented on PHP manual 
var_dump($x); // int(15) as documented. 

Nhưng tại sao một sự so sánh như thế nào tôi đã đề cập trong ví dụ đầu tiên chuyển xâu của tôi để nguyên thay vì chuyển đổi số nguyên để chuỗi.

tôi hiểu rằng bạn có thể làm một === nghiêm ngặt-so với ví dụ của tôi, nhưng tôi chỉ muốn biết:

  • Có bất kỳ phần nào của tài liệu PHP nhắc về hành vi này?
  • Có ai có thể giải thích lý do tại sao xảy ra trong PHP không?
  • Làm cách nào để người lập trình có thể ngăn chặn sự cố như vậy?
+0

== so sánh số tôi nghĩ, và khi bạn lấy và chuỗi và chuyển đổi nó thành một số nếu nó bắt đầu bằng một số, nó sử dụng số đó. Nếu nó không có thể trả lại một cái gì đó như NaN. – rubixibuc

+0

Hầu hết chúng ta mong chờ điều này ....khi đúc một chuỗi thành một số nguyên (như khi so sánh một chuỗi với một số), PHP dừng lại ở chữ số đầu tiên không phải chữ số mà nó gặp phải, trong trường hợp này là khoảng cách giữa 100 (tất cả chữ số) và "cái gì đó". SO 100 là giá trị kết quả. –

+0

Xem http://stackoverflow.com/a/8672423 – Gumbo

Trả lời

4

Nếu tôi tính toán lại PHP 'phôi' hai biến này thành loại có thể thấp nhất. Họ gọi nó là loại tung hứng. Ví dụ:

hãy thử: var_dump("something" == 0); , điều đó sẽ cung cấp cho bạn sự thật. . đã cắn tôi một lần trước đó.

Thông tin thêm: http://php.net/manual/en/language.operators.comparison.php

+0

Hướng dẫn sử dụng PHP bây giờ mô tả việc tung hứng kiểu tại http://php.net/manual/en/language.types.type-juggling.php mà lần lượt liên kết đến một phần về chuyển đổi chuỗi thành các số tại http://php.net/manual /en/language.types.string.php#language.types.string.conversion –

1

Tôi biết điều này đã được trả lời và chấp nhận, nhưng tôi muốn thêm một cái gì đó có thể giúp những người khác tìm thấy điều này qua tìm kiếm.

Tôi đã có cùng một vấn đề này khi tôi so sánh một mảng bài so với các khóa trong một mảng PHP trong mảng bài của tôi, tôi có một giá trị chuỗi phụ.

$_POST["bar"] = array("other"); 

$foo = array(array("name"=>"foobar")); 

foreach($foo as $key=>$data){ 
    $foo[$key]["bar"]="0"; 
    foreach($_POST["bar"] as $bar){ 
     if($bar==$key){ 
      $foo[$key]["bar"]="1"; 
     } 
    } 
} 

Từ đó bạn sẽ nghĩ rằng ở cuối $foo[0]["bar"] sẽ bằng với "0" nhưng những gì đã xảy ra là khi $key = int 0 được lỏng lẻo so sánh với $bar = string "other" kết quả là true để sửa lỗi này, tôi hoàn toàn so sánh, nhưng sau đó cần thiết để chuyển đổi $key = int 0 thành một $key = string "0" khi mảng POST được định nghĩa là array("other","0"); Sau đây làm việc:

$_POST["bar"] = array("other"); 

$foo = array(array("name"=>"foobar")); 

foreach($foo as $key=>$data){ 
    $foo[$key]["bar"]="0"; 
    foreach($_POST["bar"] as $bar){ 
     if($bar==="$key"){ 
      $foo[$key]["bar"]="1"; 
     } 
    } 
} 

kết quả là $foo[0]["bar"]="1" nếu 01.232.nằm trong mảng thanh POST và $foo[0]["bar"]="0" nếu "0" không nằm trong mảng thanh POST.

Hãy nhớ rằng khi so sánh các biến mà các biến của bạn có thể không được so sánh như bạn nghĩ do gõ biến dạng lỏng của PHP.

+0

Có lẽ đó chỉ là tôi, nhưng ví dụ của bạn quá phức tạp vì lợi ích của chính nó. Vấn đề có vẻ là bạn định nghĩa '$ foo' như một mảng kết hợp được lồng trong một mảng thông thường, nhưng sau đó sử dụng biểu thức mảng kết hợp' ($ key => $ data) 'để phân tích mảng thông thường. Nếu bạn phải có tổ hợp này trong dữ liệu, tại sao cũng không lồng vòng lặp đó trong vòng lặp khác để xử lý mảng thông thường? –