搜尋

首頁  >  問答  >  主體

php字串比較

我在用php作字串比較的時候,遇到了坑,如程式碼所示:

    <?php
        var_dump('00E73694765433'=='0');  //true
        var_dump('0134b40fsbi94u8'=='0'); //false
        var_dump('0134b40fsbi94u8'=='134'); //false
        echo PHP_EOL;
        var_dump(is_numeric('00E73694765433'));//true
        var_dump(is_numeric('0134b40fsbi94u8'));//false
    ?>

第一個得到的結果是true,而第二個為false。翻了一下官方文檔,如果第①個強制轉換成數字 0,那麼第②個應該強制轉換成134,但是如果是轉為134則第③個應該是正確的。
我印了一下兩個字串,得出來的結果也很奇怪,看了官方文件根本搞不懂,求大神指教一下!

typechotypecho2766 天前1005

全部回覆(4)我來回復

  • ringa_lee

    ringa_lee2017-06-16 09:20:38

    http://www.php.net/manual/zh/...

    var_dump('0134b40fsbi94u8'=='134'); //false 是比較的

    因為都是字串 就先比較第一位 第一位的比較結果 是0和1的比較 所以 是false

    字符串与整形比较的话是转换类型,
    字符串与字符串比较就是逐个比较
    但是他们是从首位开始比较的,
    也就是说 首位假如可以比较大小,就不再往下转换,不能比较的继续往下转换。能比较然后就不再往下比较
    不能比较就往下接着看!
    运行下下面这几个例子 你就明白了
    var_dump('0134b40fsbi94u8'=='134')
    var_dump('0134b40fsbi94u8'==134)
    var_dump('134b40fsbi94u8'==134)
    var_dump('134b40fsbi94u8'=='134')

    另外 字串之間的不建議使用比較運算子直接去比較大小,如果在需要比較php也提供了一些字元的比較函數

    回覆
    0
  • 学习ing

    学习ing2017-06-16 09:20:38

    不同類型的資料比較,最好還是用全等===和不全等!==運算子.
    因為比較運算子全等===和不全等!==會對型別進行檢查:

    $a === $b 表示:如果$a等于$b,并且它们的类型也相同时,返回true.
    $a !== $b 表示:如果$a不等于$b,或者它们的类型不同时,返回true.
    if(false !== 0) echo time(); //输出时间戳
    if(false !=  0) echo time(); //没有输出

    一句話,比較時盡量用===和!==而不用==和!=.

    此外,PHP也提供了一系列類型檢查函數:

    is_int/is_float/is_numeric/is_string/is_bool/is_null
    is_array/is_object/instanceof/is_resource/is_callable

    一些函數,也提供有型別檢查參數,需要注意,例如:

    in_array('value', $arr, true)
    array_search('value', $arr, true)
    array_keys($arr, 'value', true)

    第三個參數的值為 true 則函數也會檢查型別是否相同.

    另外,PHP也支援用比較運算子==,!=,===,!==來比較兩個陣列或兩個物件是否相等.

    // 输出true,表示存在相同的键值对.
    var_export( array('a' => 1, 'b' => '2D') ==  array('b' => 2, 'a' => 1) );
    
    // 输出false,因为===不仅要求键值对相同,而且要求元素的【顺序】和【类型】也相同.
    var_export( array('a' => 1, 'b' => 2) === array('b' => 2, 'a' => 1) );
    
    // 输出false,因为两个数组的键值对是不同的。
    var_export( array('a', 'b') == array('b', 'a') ); 
    左边是:
    array (
      0 => 'a',
      1 => 'b',
    )
    右边是:
    array (
      0 => 'b',
      1 => 'a',
    )

    PHP也支援用比較運算子(==,!=,===,!==)判斷兩個物件是否相等:

    class Foo {}
    $foo1 = new Foo();
    $foo2 = new Foo();
    var_export($foo1 ==  $foo2); // true
    var_export($foo1 === $foo2); // false (因为引用不同)

    回覆
    0
  • 仅有的幸福

    仅有的幸福2017-06-16 09:20:38

    你第一個字串剛好符合了科學計數法。
    對於類型限制不嚴的語言,常有這樣的坑上新聞。

    盡量使用嚴格帶類型的檢查

    回覆
    0
  • 習慣沉默

    習慣沉默2017-06-16 09:20:38

    對於 php 這種弱型語言,能用===就別用==

    回覆
    0
  • 取消回覆