0 與任意非數字(或說,不可轉換為數字的字元)前導的字串比較(運算子為==), 均傳回true.
原因是, 數字與字串比較時, 先嘗試將字串轉換為數字, 再比較, 一個不能轉換為數字的字串, 轉換結果為0, 故, 與0比較總回傳true.
在PHP裡當兩個數字型字串(只含數字的字串)進行比較的時候是直接轉換成數值進行比較的
如下例:(注意$a和$ b兩個變數的最後一位不相等)
範例程式碼:
<?php $a = '511203199106034578'; $b = '511203199106034579'; if ($a==$b) { echo 'equal'; } else { echo 'notEqual'; } ?>
執行上面的程式卻發現結果為equal(非我們認為的結果) 我們把$a與$b分別加一個字母a進去
<?php $a = 'a511203199106034578'; $b = 'a511203199106034579'; if ($a==$b) { echo 'equal'; } else { echo 'notEqual'; } ?>
這次輸出的是notEqual(正確的結果)
#說明:上面實例為equal是因為PHP把兩個數字型字串轉換成數字型,而這兩個數字剛好相等
<?php $a = 511203199106034578; $b = 511203199106034579; echo $a; // 输出 5.1120319910603E+17 即511203199106030000 echo $b; // 输出 5.1120319910603E+17 即511203199106030000 ?>
所以我們在範例中得到的結果是equal
避免這種非預期結果的情況是使用類型比較符===如下範例(如果$ a 等於$b,它們的型別也相同)
<?php $a = '511203199106034578'; $b = '511203199106034579'; if ($a===$b) { echo 'equal'; } else { echo 'notEqual'; } ?>
舉例解釋一下
<?php $str1 = "123456789012345678"; $str2 = "123456789012345679"; if($str1 == $str2){ echo "1.equal\n"; }esle{ echo "1.not equal\n"; } if($str1 === $str2){ echo "2.equal\n"; }esle{ echo "2.not equal\n"; } if(strcmp($st1, $str2)==0){ echo "3.equal\n"; }esle{ echo "3.not equal\n"; } if($str1 == $str2){ echo "1.equal\n"; }esle{ echo "1.not equal\n"; }
運行後的結果挺詭異的:
1.equal
#2.not equal
3.not equal
查了一下原因,php在比較兩個數字字串的時候,首先會把這兩個字串當做數字,並且用科學計數法儲存這兩個字串,科學計數法保留小數點後16位元。換言之,在儲存時,$str1=1.2345678901234567E+17;$str2=1.2345678901234567E+17。於是判斷$str1==$str2。長度不同、在字串中加非數字字元等等都會造成兩個字串的不等。所以,在能夠確定資料型別的前提下推薦使用三等號判斷,或是用strcmp或strcasecmp來進行強型別判斷。
以上是詳解php數字和字串比較容易出現的陷阱的詳細內容。更多資訊請關注PHP中文網其他相關文章!