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

posted @ 2020-11-05 17:26  大熊童鞋  阅读(142)  评论(0编辑  收藏  举报