18

PHP.netで自動生存を検索しても結果は得られません。これを書いている時点で、ウィキペディアはPerlだけがそれを持っていると主張しています。Googleで「phpautovivification」を検索しても、明確な結果はありません。

この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 が autovivification をサポートしている場合、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} エントリは実際には作成されませんが、暗示されていることに注意してください。

   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 に答える