如果比較一個數字和字符串或者比較涉及到數字內容的字符串,則字符串會被轉換爲數值並且比較按照數值來進行。此規則也適用於 switch 語句。
<?php
var_dump(0 == "a"); // 0 == 0 -> true
var_dump("1" == "01"); // 1 == 1 -> true
var_dump("10" == "1e1"); // 10 == 10 -> true
var_dump(100 == "1e2"); // 100 == 100 -> true
switch ("a") {
case 0:
echo "0"; //輸出 0
break;
case "a": // 不會執行,因爲'a'匹配了0
echo "a";
break;
}
拓展:字符串轉換爲數值
當一個字符串被當作一個數值來取值,其結果和類型如下:
如果該字符串沒有包含 '.','e' 或 'E' 並且其數字值在整型的範圍之內(由 PHP_INT_MAX
所定義),該字符串將被當成 integer 來取值。其它所有情況下都被作爲 float 來取值。
該字符串的開始部分決定了它的值 ±(0-9).(0-9)。如果該字符串以合法的數值開始,則使用該數值。否則其值爲 0(零)。合法數值由可選的正負號,後面跟着一個或多個數字(可能有小數點,.3當0.3),再跟着可選的指數部分。指數部分由 'e' 或 'E' 後面跟着一個或多個數字構成。
<?php
$foo = 1 + "10.5"; // $foo is float (11.5)
$foo = 1 + "-1.3e3"; // $foo is float (-1299)
$foo = 1 + "bob-1.3e3"; // $foo is integer (1)
$foo = 1 + "bob3"; // $foo is integer (1)
$foo = 1 + "10 Small Pigs"; // $foo is integer (11)
$foo = 4 + "10.2 Little Piggies"; // $foo is float (14.2)
$foo = "10.0 pigs " + 1; // $foo is float (11)
$foo = "10.0 pigs " + 1.0; // $foo is float (11)
?>
對於多種類型,比較運算符根據下表比較(按順序)。
運算數 1 類型 | 運算數 2 類型 | 結果 |
---|---|---|
null 或 string | string | 將 NULL 轉換爲 "",進行數字或詞彙比較 |
bool 或 null | 任何其它類型 | 轉換爲 bool,FALSE < TRUE |
object | object | 內置類可以定義自己的比較,不同類不能比較,相同類和數組同樣方式比較屬性(PHP 4 中),PHP 5 有其自己的說明 |
string,resource 或 number | string,resource 或 number | 將字符串和資源轉換成數字,按普通數學比較 |
array | array | 具有較少成員的數組較小,如果運算數 1 中的鍵不存在於運算數 2 中則數組無法比較,否則挨個值比較(見下例) |
object | 任何其它類型 | object 總是更大 |
array | 任何其它類型 | array 總是更大 |
in_array ( mixed $needle
, array $haystack
[, bool $strict
= FALSE
] ) :bool 踩過的 一個坑
注意事項:弱類型比較,特別是0的比較,如果需要嚴格比較,指定第三個參數爲true。
<?php
$test = 0;
$array = array('a', 'b', 'c');
if (in_array($test, $array)) {
echo 'in array';
} else {
echo 'no';
}
//output: in
$test = '0';
$array = array('a', 'b', 'c');
if (in_array($test, $array)) {
echo 'in array';
} else {
echo 'no';
}
//output: no
拓展:PHP 類型比較表
以上內容參考:比較運算符