• php 面试陷阱


           $arr = array(0 =>1,"aa"=>2,3,4);
           foreach($arr as $key=>$val){
    
               print($key=="aa"?5:$val);
           }
    
    答案:然后遍历每一个元素的key看等不等于aa,等于就用5替代。
    当我告诉你答案是5534的时候,你会不会有点惊讶!
    难道0等于
    "aa"吗?是的,0就等 于"aa",这道题重点就考你这个。
    在PHP中两个值进行逻辑判断时,如果两个值的类型不一致PHP会自动把右边的值转换到左边的类型,然后再进行判断。
    因 此"aa"转换整形等于0,自然也就等于左边的0了。
    你可以使用全等于避免这种该情况,也就是如果你写成: print($key
    === "aa" ? 5 : $val); 那么答案就是1534了。
            $data = array('不发','胖虎','');
            foreach ($data as $key => $val) {
                var_dump($data[$key]);
                $val = &$data[$key];
                var_dump($val);
                var_dump($data);
    
            }
    
    
    string(6) "不发"
    string(6) "不发"
    array(3) {
      [0]=>
      &string(6) "不发"
      [1]=>
      string(6) "胖虎"
      [2]=>
      string(3) ""
    }
    string(6) "胖虎"
    string(6) "胖虎"
    array(3) {
      [0]=>
      string(6) "胖虎"
      [1]=>
      &string(6) "胖虎"
      [2]=>
      string(3) ""
    }
    string(3) ""
    string(3) ""
    array(3) {
      [0]=>
      string(6) "胖虎"
      [1]=>
      string(3) ""
      [2]=>
      &string(3) ""
    }
    $data = ['a', 'b', 'c'];
     
    //1、
    foreach ($data as $key => $val) {
        $val = &$data[$key]; // 进行引用传值,此时的$val内存地址被赋值为$data[0]
        print_r($data);
    }
    //2、此时的$val内存地址为$data[0],foreach将$data[1]赋值给$val,所以$data[1]被赋值到了$data[0]
    foreach ($data as $key => $val) { // $data =['b','b','c']
        $val = &$data[$key]; // 进行引用传值,此时的$val内存地址被赋值为$data[1]
        print_r($data);
    }
    //2、此时的$val内存地址为$data[1],foreach将$data[2]赋值给$val,所以$data[2]被赋值到了$data[1]
    foreach ($data as $key => $val) { // $data =['b','c','c']
        $val = &$data[$key]; // 进行引用传值,此时的$val内存地址被赋值为$data[2]
        print_r($data);
    }

    在第一次循环的时候,$val就被定义成了指向$data['0']的一个引用变量,而foreach的特殊机制在下次循环的时候保留了这个变量与内存地址,所以就把$data[0]和$data[1]覆盖了

    只要在每次循环结束前,加上一个unset()就可以把这个引用变量给清除了ヽ(≧□≦)ノ

    世界上最美的风景,是自己努力的模样
  • 相关阅读:
    git客户端
    Autowired注解的妙用---在Controller里的构造函数里获取需要注入的对象
    面向对象的理解
    改变对update的做法
    时间戳与日期相互转换
    Git随记
    json数据传输有感
    Mybatis的批量CRUD
    并发与线程有感
    dpkg --info
  • 原文地址:https://www.cnblogs.com/xiong-hua/p/13932870.html
Copyright © 2020-2023  润新知