• 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()就可以把这个引用变量给清除了ヽ(≧□≦)ノ

    世界上最美的风景,是自己努力的模样
  • 相关阅读:
    计算任一输入的正整数的各位数字之和,并分析算法的时间复杂度
    10万数组去重,排序,找最多出现次数,(复杂度没有前一个博客好,随手写,有点烂)
    Maven环境搭建
    Tomcat内部结构及请求原理(转)
    Tomcat环境搭建
    斐讯面试记录—三线程交替打印ABC
    斐迅面试记录—SSL和TLS的区别
    斐迅面试记录—Http协议中的Header
    斐讯面试记录—强+软+弱+虚引用
    斐讯面试记录—TCP滑动窗口及拥塞控制
  • 原文地址:https://www.cnblogs.com/xiong-hua/p/13932870.html
Copyright © 2020-2023  润新知