首頁  >  文章  >  後端開發  >  詳解php數字和字串比較容易出現的陷阱

詳解php數字和字串比較容易出現的陷阱

伊谢尔伦
伊谢尔伦原創
2017-06-21 13:11:071777瀏覽

0 與任意非數字(或說,不可轉換為數字的字元)前導的字串比較(運算子為==), 均傳回true.

原因是, 數字與字串比較時, 先嘗試將字串轉換為數字, 再比較, 一個不能轉換為數字的字串, 轉換結果為0, 故, 與0比較總回傳true.

在PHP裡當兩個數字型字串(只含數字的字串)進行比較的時候是直接轉換成數值進行比較的 

如下例:(注意$a和$ b兩個變數的最後一位不相等) 

範例程式碼:

<?php 
$a = &#39;511203199106034578&#39;; 
$b = &#39;511203199106034579&#39;; 
if ($a==$b) { 
echo &#39;equal&#39;; 
} else { 
echo &#39;notEqual&#39;; 
} 
?>

執行上面的程式卻發現結果為equal(非我們認為的結果) 我們把$a與$b分別加一個字母a進去 

<?php 
$a = &#39;a511203199106034578&#39;; 
$b = &#39;a511203199106034579&#39;; 
if ($a==$b) { 
echo &#39;equal&#39;; 
} else { 
echo &#39;notEqual&#39;; 
} 
?>

這次輸出的是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 = &#39;511203199106034578&#39;; 
$b = &#39;511203199106034579&#39;; 
if ($a===$b) { 
echo &#39;equal&#39;; 
} else { 
echo &#39;notEqual&#39;; 
} 
?>

舉例解釋一下

<?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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn