PHP 字串比較

2021-10-01 13:20:41 字數 3899 閱讀 7909

因為 php 是弱型別語言,所以在進行比較的時候,有時候會出現意料之外的結果,今天我們就來總結一下 php 變數比較的一些情況。

首先說明,只有相同資料型別的值才能比較,php 也不例外。只不過 php 在進行不同型別的值比較之前會將其轉換為同樣的資料型別,然後進行比較。這樣 php 的值比較問題就轉換為了 php 不同資料型別之間的轉換問題了。

php 字串比較一般是按位進行比較,所以以下表示式均能得到大家想要的結果。

var_dump(''

=='null');

//false

var_dump(''

=='0');

//false

但是,一旦字串的內容是合法的數字表示式(包括科學記數法),這時候即使比較的都是字串,php也會進行資料型別轉換, 首先把字串轉換為對應的整型或者浮點型,然後進行比較。

var_dump

('0'

=='00');

//true

var_dump

('100'

=='1e2');

//true

var_dump

('.12'

=='0.12');

//true

var_dump

('12aaa'

=='12');

//false 因為 '12aaa' 並不全是數字,所以不進行型別轉換,依然安位比較

var_dump

('12aaa'

==12);

//true 因為比較運算子右邊是整型 12,所以先進行型別轉換,然後比較

如果我們把==換成===結果會是怎麼樣呢?我們來看一下

var_dump

('0'

==='00');

//false

var_dump

('100'

==='1e2');

//false

var_dump

('.12'

==='0.12');

//false

var_dump

('12aaa'

==='12');

//false

var_dump

('12aaa'

===12);

//false

可以看到全等號===對於 php 字串的比較會嚴格執行按位比較,即使對於數字表示式的字串也不會進行轉換。

如果型別不同,比如字串和布林值進行比較,php 首先會把字串轉換為布林值然後進行比較。我們先來看一組 demo

var_dump(''

==true);

//false

var_dump

('0'

==true);

//false

var_dump

('1'

==true);

//true

var_dump

('00'

==true);

//true

var_dump

('0q'

==true);

//true

var_dump

('a0'

==true);

//true

var_dump

('null'

==true);

//true

php 字串轉換為布林值的規則是

若字串為空,則為 false;若字串不為空,則為 true;『0』 為 false

如果字串和資料型別的值比較,首先字串會轉換為數字型別的值,然後進行比較。轉換規則如下:

如果字串是合法的數字表示式(包括科學記數法),則將其轉換為對應的數字;如果字串以數字開頭,或者以小數點開頭並且後面緊跟數字 ,會取開頭部分的數字表示式將其轉換為數字;如果字串以非數字開頭,或者小數點開頭後面緊跟非數字,轉換為0。

所以會有以下結果

var_dump

('adkf'==0

);//true

var_dump

('0asda'==0

);//true

var_dump

('1ad'==0

);//false

var_dump

('adkf'

=='0asda');

//false

var_dump

('adkf'

=='0');

//false

var_dump

('0asda'

=='0');

//false

var_dump

('.12ads'

==0.12);

//true

var_dump

('e2ada'

==100);

//false

var_dump

('1e2asd'

==100);

//true

var_dump

('1e2asd'

=='100');

//false

在 php 中 未定義的變數和屬性和 null 相等,所以會有以下結果

$a

=null;$b

;var_dump

(isset($a

));//false

var_dump

(isset($b

));//false

var_dump

(isset($c

));//false

classa$o

=newa(

);var_dump

(isset($o

->v1)

);//false

var_dump

(isset($o

->v2)

);//false

var_dump

(isset($o

->v3)

);//false

var_dump($c

==null);

//會有 notice 報錯,不過結果是 true

var_dump($c

===null);

//會有 notice 報錯,不過結果是 true

var_dump

(is_null($c

));//會有 notice 報錯,不過結果是 true

還有一些下面的例子,也是涉及到型別轉換

var_dump([

]==false);

//true

var_dump(''

==false);

//true

var_dump

(null

==false);

//true

var_dump(''

==null);

//true

var_dump([

]==null);

//true

var_dump(''

==);//false

由於 php 的弱型別特性,在進行比較或者 if 判斷的時候,有時候會發生意想不到的結果。所以在用 php 做判斷的時候,一定要牢記不同變數的型別。為了防止意想不到的問題,可以使用全等於===或者字串比較函式strcmp進行判斷

note: 以上**全部使用7.3 版本得出結果

php字串如何比較,PHP字串比較

我們在 中用的最多的邏輯是什麼?你知道如下的幾段 的布林結果分別是什麼麼?var dump 1 1e0 var dump 1 0x1 var dump 20 2e1 var dump 10 0x0a 等等 對,也許你會說在php手冊的附錄中有一部分關於這個問題的總結.問題是,這只是知其然,那麼所以然...

PHP字串比較

我們在 中用的最多的邏輯是什麼?你知道如下的幾段 的布林結果分別是什麼麼?var dump 1 1e0 var dump 1 0x1 var dump 20 2e1 var dump 10 0x0a 等等 對,也許你會說在php手冊的附錄中有一部分關於這個問題的總結.問題是,這只是知其然,那麼所以然...

PHP字串比較

作者 laruence 我們在 中用的最多的邏輯是什麼 你知道如下的幾段 的布林結果分別是什麼麼?1.var dump 1 1e0 2.var dump 1 0x1 3.var dump 20 2e1 4.var dump 10 0x0a 等等 對 也許你會說在 php手冊的附錄中有一部分關於這個問...