0
点赞
收藏
分享

微信扫一扫

php 面试陷阱

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了。

 

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

世界上最美的风景,是自己努力的模样



举报

相关推荐

0 条评论