PHP自动化

时间:2011-05-11 09:50:26

标签: php autovivification

更新:我对此问题的初衷是确定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”并没有提出一个典型的答案或例子。

3 个答案:

答案 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