本帖最后由 xyang81 于 2011-09-18 14:42:30 编辑

解决方案 »

  1.   

    $a = '0';
    就可以得到 没有找到匹配的值! 了这与 php 默认在比较时忽略数据类型有关
    $a = 0;
    if($a == 'a')
      echo 'ok'; //这个 ok 是会输出的
      

  2.   

    本帖最后由 xuzuning 于 2011-09-18 14:51:48 编辑
      

  3.   

    应该跟 弱类型有关吧...俺不知道。
    在js 下测试了一下 js 没有这问题....
      

  4.   

    php比较的一些规则,更详细的见http://www.php.net/manual/zh/types.comparisons.php
      

  5.   

    ca,好不容上传个图片。百度还防盗链?re,看网页吧,字符串和数值(非0)== 运算的结果是true.
      

  6.   

    你去看下php手册
    因为php里面的字符串转数字规则是:如果字符串以数字开头,则转为这个数字。
    例如:$a = (int)"2d2DD";
    var_dump($a);得到的结果是2.$a = (int)"d2DD";
    var_dump($a);得到结果是0.$a = (int)"a";
    var_dump($a);
    原理同上。
    如果$a = (int)"a";如果是c语言的语法,则:int b = (int)"a";得到的是97.
    php这里跟c是处理不一样。
      

  7.   

    $a = 0 ,$a 是int的 ,而你case里面却是string 当然不匹配了
      

  8.   


    实际上是匹配的。。是按照 ==来处理的,字符串和非0数值 ==的结果是false,和0 == 的结果是true
      

  9.   

    这个跟我觉得那个是一样,从本质来说,你的说的这个也是错得。如果是数值跟字符串比较,我觉得zend虚拟机,首先把字符串转为int,然后再进行比较。
    “字符串和非0数值 ==的结果是false”
    举个例子反驳这个观点:var_dump("5dfd"==5);得到结果是ture。你自己试下。
    “和0 == 的结果是true”
    再举个例子反驳你说的这个观点:var_dump("5dfadf"==0);得到的记过是false。
    你可以自己试一下,原因跟我七楼说的一样。
      

  10.   

    嘿,测试的有点偏了,只测试了像‘aaa’,'bb','sdfefe'这种字符串。刚测试了一下‘33333ddsdf',发现确实是false.
    看来结论有时候也不能下的太早啊。嘿嘿。
      

  11.   

    刚查资料补习了一下:
       在某些情况下,PHP会把类数值数据(如含有数字的字符串等)转换成数值处理,== 运算符就是其中之一。在使用 == 运算符对两个字符串进行松散比较时,PHP会把类数值的字符串转换为数值进行比较.   in_array()函数也有这个机制(还可以设置第三个参数打开in_array的强类型机制)
      

  12.   

    转换机制是这样的,那为什么将“a”强行转换成int型后,转换后值却是0呢??php里面的转换机制和底层又是怎么处理的呢???值得讨论
      

  13.   

    $a = 0;
    case "a":
    你可以去看下php的强制转换机制。
    你把$a和一个字符串比较。
    也就是一个整型和一个字符串比较。
    那么他的字符串被强制转换为整型。而字符串"a"转换为整型结果为0,所以相等了。
    这是php弱类型决定的。
    如果你想要得到正确的结果。你可以用if来判断。
    if($a==="a") {
         echo 'aaaa';
    }
    此时是不会输出的。应为“==”比较的只是值。“===”比较的是值以及类型。
      

  14.   

    是这样:$a = 0;
    $bool = ($a == 'a'); // note
    var_dump($bool);
    if($a == 'a') {
    echo "AAA";
    }//note:整型数据和字符串数据比较时有一个规则:
    /**
     * 字符串与整型数字进行比较时,
     * 字符串会先转换为整型,
     * 如果字符串以数字开头,则将开头的数字作为该字符串的转换结果
     * 如果字符串以非数字开头,则会在数值上转换为零
     */
      

  15.   

    这个是zend处理的,它要按照这样的规则,源码就这样实现。
    如果想看底层,那就去找找源码怎么写的吧。用c语言实现的。