18

在PHP.net中搜索autovivification 没有结果。在撰写本文时,维基百科声称只有 Perl 拥有它。在谷歌搜索“php autovivification”时没有明确的结果。

此 PHP 代码运行良好:

$test['a'][4][6]['b'] = "hello world";
var_dump($test);

array
  'a' => 
    array
      4 => 
        array
          'b' => 
            array
              ...

任何人都可以提供 PHP 确实具有此功能的规范答案(最好有参考资料),以及任何细节,例如引入它的版本、怪癖、快捷方式等?

4

3 回答 3

11

是的,PHP 确实具有自动激活功能(并且已经使用了很长时间),尽管该术语没有引用它。 PHP.net状态:

可以通过在其中显式设置值来修改现有数组。

这是通过将值分配给数组并在括号中指定键来完成的。也可以省略该键,从而产生一对空括号 ([])。

$arr[key] = value;
$arr[] = value;
// key may be an integer or string
// value may be any value of any type

如果 $arr 尚不存在,它将被创建,因此这也是创建数组的另一种方法。

但是,文档指出,如果您尝试访问未设置的数组(或键)的值,它将返回错误:

尝试访问尚未定义的数组键与访问任何其他未定义的变量相同:将发出 E_NOTICE 级别的错误消息,结果将为 NULL。

我已经找到了我的旧PHP3手册,其中指出:

您还可以通过简单地向数组添加值来创建数组。

$a[] = "hello";
于 2011-05-11T13:34:50.940 回答
3

如果 PHP 支持自动激活,那么不是 100%,但您发布的语法在大多数情况下都有效。

// Works as you have assigned a value of 'hello'
$a['a'][4][6]['b'] = "hello";
var_dump($a);
echo print_r($a,true);

// works as you have assigned a value of 'world'
$b[][][][] = "world";
var_dump($b);
echo print_r($b,true);

// ERROR: Cannot use [] for reading
$c[];
var_dump($c);
echo print_r($c,true);

无法使用 [] 阅读:相关链接

于 2011-05-11T13:21:24.893 回答
2

在 perl 中,项目将在检查时自动激活,不需要分配。到达最里面的请求键所需的项目路径将在检查时创建。请注意,{d => undef} is 条目实际上并未创建,而是隐含的。

   use strict;
   use warnings;
   use Data::Dumper;

   my %a;       # as is empty, equivalent to \%a is {};
   print Dumper %a;
   $a{b}{c}{d}; # \%a is now { b => { c => {}}}
                # returns an undef value.
   print Dumper \%a;

输出:

$VAR1 = {};
$VAR1 = {
          'b' => {
                   'c' => {}
                 }
        };

perl 数组示例:

use strict;
use warnings;
use Data::Dumper;

my (@b,@c);          # @b=(), @c=()
print Dumper \@b;
$b[3];               # @b=() aka unchanged.
print Dumper \@b;
$b[3][2][1];         # @b=(undef,undef,undef,[undef,undef,[]])
print Dumper \@b;
print Dumper \@c;
$c[3]=1  ;           # @c=(undef,undef,undef,1)
print Dumper \@c;

输出:

Useless use of array element in void context at -e line 7.
Useless use of array element in void context at -e line 9.
$VAR1 = [];
$VAR1 = [];
$VAR1 = [
          undef,
          undef,
          undef,
          [
            undef,
            undef,
            []
          ]
        ];
$VAR1 = [];
$VAR1 = [
          undef,
          undef,
          undef,
          1
        ];
于 2011-10-26T01:40:25.963 回答