鍍金池/ 問答/PHP/ 【PHP】如何處理才能讓如下結(jié)果符合預(yù)期呢?

【PHP】如何處理才能讓如下結(jié)果符合預(yù)期呢?

clipboard.png

clipboard.png
現(xiàn)在是1和0比較出來是true,1和1比較出來是false,該怎么處理才能讓結(jié)果符合預(yù)期呢?

還有個很奇怪的地方,$val明明值為1,但是卻是一個非整型字符串,(int)$val的結(jié)果是0

回答
編輯回答
任她鬧

之前有遇到過接口返回數(shù)據(jù)長度多3個的情況,如果長度是固定的

if (strlen($val) > 1){
    $val = substr($val,13);
}
2018年5月2日 22:46
編輯回答
莓森

怎麼重覆提問了-.-順便把裏面的答案更正一下
https://segmentfault.com/q/10...

PHP 跟其他語言(如java)的一個不同的地方是php用 $ 就可以存取全部類型,而java 使用int或string或其他都要聲明為int或string等...

所以php在做 == 比較運算時在某情況下會自動做隱式處理,你例子裏是int 和 string作比較,php會忽略類型比較並且把string的值轉(zhuǎn)換成0。

你這個例子的string是14位數(shù),估計裏面包含了&nbsp這些佔位符,根據(jù)PHP的規(guī)則,這個string(14)"1" 會隱式轉(zhuǎn)換成string(1)0,而當(dāng)你的$val 也是int(0)時,因為只比較數(shù)值,自然返回true了。

不過官方未可能沒有提及到的情況是,當(dāng)string的第1位是數(shù)字時,比如string(2)"1a" 不會把1a轉(zhuǎn)換成0,只有第1位是非數(shù)字時才會轉(zhuǎn)換成0,如string(2)"a1" 會變成0。

但是注意string(3)"1e0" (1e0 ~ 1e9),則會轉(zhuǎn)換成string(1)"1" (1 ~ 1000000000) ,因為1e本身是數(shù)學(xué)上的函數(shù)。

2018年9月10日 15:15
編輯回答
卟乖

請貼上你的PHP版本,我在PHP5.6版本下測試
這是我的測試
圖片描述

以下是我的測試結(jié)果
圖片描述

如果是因為==會進行轉(zhuǎn)化,你可以考慮===全等來判斷類型和值,
例如

'1' === 1 //false
'1' === (string)1  // true

如果是因為如果是包含其他多余字符,建議你用trim方法來去除一下多余的字符串

2017年7月27日 01:40