如果在php的“二维”数组生成的时候使用IIFE unset掉,会不会变成一维?
所谓联想
受到腾讯一道面试题的启发(不确定是否为官方原题,但至少我看到的这个版本在题目的描述上就存在问题)
什么是php的多维数组类型?
A、php的值也是多种数据类型
B、php的值也是数组类型
C、php的索引值有数字和字母
D、以上都是
云运算一下
这里有一段代码,试着 云运算一下?
<?php
$a = ['test'=>["test"],
"b"=>(function (&$a){
unset($a['test']);
$a['c']='aaa';
})($a)];
var_dump($a);
?>
如果你的答案是
//type 1
array(2) {
["b"]=>
NULL
["c"]=>
string(3) 'aaa'
}
//type 2
array(1) {
["c"]=>
string(3) 'aaa'
}
这两个中的一个的话,那可能你要非常小心了。因为这两个是不正确的。
正确答案
array(2) {
["test"]=>
array(1) {
[0]=>
string(4) "test"
}
["b"]=>
NULL
}
解析
如果你没有仔细的考虑或者了解过IIFE亦或者php的语句执行的话,那你可能就会很重要中招了。
我们逐句来读这段代码
$a = ['test'=>
["test"],//生成二维数组,键是test,值是以test为值,0为键的一维数组
"b"=>(function (&$a){ //IIFE,参数为$a的指针
unset($a['test']); //删除$a的test
$a['c']='aaa';//新增键c,值为aaa
})($a)];
var_dump($a);
上面已经把重要语句逐句理清楚了。咋一看没什么问题,仔细一看也没什么问题,但是问题是“答案为什么和我想的不一样”
问题在哪里呢?
答案在IIFE上
IIFE的参数是$a,可是想像一下,在执行这个函数之前,$a真的存在吗?如果不存在,那传递的这个地址(指针)就是空指针,等于新建了一个变量而已。
对,这就是答案。可是为何?
因为这一条语句并没有执行完成,也就是说,其实这里的二维数组还没有赋值给变量 $a,自然在调用这个变量的时候,就是空的了。
所以在二维数组生成的时候,用IIFE是没有办法unset掉的,这就回答了标题里面的问题。
新的风暴已经出现
那么,回到这道面试题,我新提出的问题是,“在声明一个二维数组时,二维数组的第一级键的值一定有数组”。这句话,对吗?我不知道是否有人看到这篇文章,但是答案我已经知道了。而且可以告诉你————不对。
一个IIFE所给的反例:
$a = ['test'=>'',
"b"=>(function (){
return ['I am fisher, 2 divs array'];
})()];
var_dump($a);
云运算一下,来碰一碰?