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()就可以把这个引用变量给清除了ヽ(≧□≦)ノ
世界上最美的风景,是自己努力的模样