更新:我对此问题的初衷是确定PHP是否确实具有此功能。在答案关注标量问题时,这已经失去了。请改为查看此新问题:"Does PHP have autovivification?"此问题留待此处参考。
According to Wikipedia,PHP没有自动生成功能,但此代码有效:
$test['a']['b'] = 1;
$test['a']['c'] = 1;
$test['b']['b'] = 1;
$test['b']['c'] = 1;
var_dump($test);
输出:
array
'a' =>
array
'b' => int 1
'c' => int 1
'b' =>
array
'b' => int 1
'c' => int 1
我发现此代码也有效:
$test['a'][4] = 1;
$test['b'][4]['f'] = 3;
但添加此行会导致警告(“警告:不能将标量值用作数组”)
$test['a'][4]['f'] = 3;
这里发生了什么?为什么在索引后添加关联元素时它会失败?这是“真正的”Perl式自动更新,还是其中的一些变体,还是别的什么?
编辑:哦,我现在看到了标量的错误,哎呀!这些按预期工作:
$test['a'][4]['a'] = 1;
$test['a'][4]['b'] = 2;
$test['a'][5]['c'] = 3;
$test['a'][8]['d'] = 4;
那么,php确实有autovivification?在Google上搜索“php autovivification”并没有提出一个典型的答案或例子。
答案 0 :(得分:7)
来自方括号语法的PHP manual:
$arr[] = value;
如果
$arr
尚不存在,它将被创建,因此这也是创建数组的另一种方法
用你的例子:
$test['a'][4] = 1;
由于$test
和$test['a']
目前不存在;它们都是作为数组创建的。
$test['b'][4]['f'] = 3;
$test['b']
和$test['b'][4]
目前不存在;它们都是作为数组创建的。
$test['a'][4]['f'] = 3;
$test['a'][4]
确实存在,但它是一个整数(1
)。这是不能用作数组的“标量值”。您不能对数字值使用方括号[]
语法;它不会将现有值转换为数组。
答案 1 :(得分:2)
根据结果,PHP具有自动生成功能。错误来自它的工作方式。
当你说:$ a [1] [2] = 55时,PHP希望将55插入$ a [1],如[2] => 55。由于$ a [1]不存在,PHP 自动创建一个空节点,cca。 $ a [1] = Array()。但是当节点已经存在时,PHP不会创建$ a [1],只执行[2] => 55,这是一个错误,如果$ a [1]不是类似数组(数组,对象)。
我见过的最后一种语言是MUMPS,其中节点可能有价值,而孩子也有。还有一个名为$ DATA()的函数,它告诉节点一个节点有任何子节点(10),值(1)或两者(11),或者它不存在(0)。我认为,这是关联数组的正确的处理。
(无论如何,我喜欢PHP的这种行为。)
答案 2 :(得分:1)
使用:
$test['b'][4]['f'] = 3;
您没有向
添加元素$test['a'][4]
因为它没有被初始化为数组。
如果你写的话:
$test['a'][4] = array(1);
然后它会起作用。
使用:
$test['a']['b'] = 1;
$test['a']['c'] = 1;
$test['b']['b'] = 1;
$test['b']['c'] = 1;
您隐式地将$test['a']
和$test['b']
初始化为数组。但$test['a']['b']
(依此类推)为int