1. 程式人生 > >18.PHP數字與字串比較的誤區

18.PHP數字與字串比較的誤區

2016.12.03


1.問題描述


今天在做微信關鍵詞自動回覆時,需要判斷輸入的是否為整數,使用了

if(intVal($key) == $key),

即將輸入轉化為整數再與自身比較,若相等則為整數,但是發現無論輸入什麼結果都是相等


2.解決過程


列印從微信過來的輸入變數型別發現為string型,所以猜想是將整形和字串作比較時出錯。

查詢相關資料發現,在PHP中,當數字與字串作比較時,系統會先將字串轉化為數字,再與數字進行比較。

所以以上判斷條件等價於if(intVal($ket) == intVal($key)),自然一直是相等的。

將一個無法轉換為數字的字串轉化為數字,結果總是為0 ,所以將其與0總是返回true。


3.延伸拓展


PHP中比較運算子的規則

1).當兩個字元進行比較時,比較這兩個字元的ASCII碼

2).當兩個字串進行比較時,從第一個字元開始挨個比較對應的ASCII碼,知道某一位置兩個字元ASCII碼不一致時給出結果,如'ba'>'az','10'<'a'

3).當一個數字與一個字元/字串比較時,首先將字元/字串轉化為數字,再與數字進行比較,如12<'21as', 'dsa'=0,同理 'a'+10=10;

4).當兩個數字字串進行比較時,首先將兩個字串當做數字,並且用科學計數法儲存這兩個字串,科學計數法保留小數點後16位,再進行比較。

由此就會產生一個bug

如:$str1 = "123456789012345678";

   $str2 = "123456789012345679";

(最後一位不一樣)

在比較時會先將兩個字串用科學計數法進行儲存,因為保留16位小數,所以結果為

$str1=1.2345678901234567E+17;

$str2=1.2345678901234567E+17。

結果再比較就會產生$str1 等於 $str2 這樣的結果;

解決辦法為使用 === 或者strcmp等字串比較函式進行強型別判斷

另外,長度不同、在字串中加非數字字元等等都會引起兩個字串的不等。

例如:$str1 = "a123456789012345678";

            $str2 = "a123456789012345679";

此時$str1 和 $str2就不相等,因為存在a 這個非數字字元,所以系統不會講兩個字串當成數字字串進行比較,而是使用 2)中兩個字串比較方法。


參考連結:http://www.cnblogs.com/lwbqqyumidi/archive/2013/01/31/2887086.html