所谓联想

受到腾讯一道面试题的启发(不确定是否为官方原题,但至少我看到的这个版本在题目的描述上就存在问题)

什么是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);

云运算一下,来碰一碰?