Oll*_*ass 9 php autovivification
更新:我对此问题的初衷是确定PHP是否确实具有此功能.在答案关注标量问题时,这已经失去了.请改为查看这个新问题:"PHP是否具有自动生成功能?" 这个问题留待这里参考.
根据维基百科,PHP没有自动更新,但此代码有效:
$test['a']['b'] = 1;
$test['a']['c'] = 1;
$test['b']['b'] = 1;
$test['b']['c'] = 1;
var_dump($test);
Run Code Online (Sandbox Code Playgroud)
输出:
array
'a' =>
array
'b' => int 1
'c' => int 1
'b' =>
array
'b' => int 1
'c' => int 1
Run Code Online (Sandbox Code Playgroud)
我发现这段代码也有效:
$test['a'][4] = 1;
$test['b'][4]['f'] = 3;
Run Code Online (Sandbox Code Playgroud)
但添加此行会引发警告("警告:不能将标量值用作数组")
$test['a'][4]['f'] = 3;
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?为什么在索引后添加关联元素时它会失败?这是'真正的'Perl式自动更新,还是其中的一些变体,还是其他什么?
编辑:哦,我现在看到标量的错误,哎呀!这些按预期工作:
$test['a'][4]['a'] = 1;
$test['a'][4]['b'] = 2;
$test['a'][5]['c'] = 3;
$test['a'][8]['d'] = 4;
Run Code Online (Sandbox Code Playgroud)
那么,php确实有autovivification?在Google上搜索"php autovivification"并没有提出一个规范的答案或例子.
从方括号语法的PHP手册:
$arr[] = value;如果
$arr尚不存在,则会创建它,因此这也是创建数组的另一种方法
用你的例子:
$test['a'][4] = 1;
Run Code Online (Sandbox Code Playgroud)
由于$test与$test['a']目前不存在; 它们都是作为数组创建的.
$test['b'][4]['f'] = 3;
Run Code Online (Sandbox Code Playgroud)
$test['b']并且$test['b'][4]目前不存在; 它们都是作为数组创建的.
$test['a'][4]['f'] = 3;
Run Code Online (Sandbox Code Playgroud)
$test['a'][4] 确实存在,但它是一个整数(1).这是不能用作数组的"标量值".您不能[]在数字值上使用方括号语法; 它不会将现有值转换为数组.