9

更新:この質問に対する私の当初の意図は、PHPが実際にこの機能を備えているかどうかを判断することでした。これは、スカラーの問題に焦点を当てた回答では失われています。代わりに、この新しい質問を参照してください:「PHPには自動活性化がありますか?」この質問は参考のためにここに残されています。

ウィキペディアによると、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には自動生存がありますか?Googleで「phpautovivification」を検索しても、正規の回答やその例は表示されません。

4

3 に答える 3

7

角括弧構文に関するPHPマニュアルから:

$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)です。これは、配列として使用できない「スカラー値」です。[]数値に角括弧構文を使用することはできません。既存の値を配列に変換しません。

于 2011-05-11T09:59:10.907 に答える
3

結果によると、PHP には autovivification があります。エラーは、その動作方法に起因します。

$a[1][2] = 55 と言うと、PHP は 55 を [2]=>55 として $a[1] に挿入しようとします。$a[1] が存在しないため、PHP は自動的に空のノードcca を作成します。$a[1] = 配列()。しかし、ノードが既に存在する場合、PHP は $a[1] を作成せず、単に [2]=>55 を実行します。これは、$a[1] が配列のようなもの (配列、オブジェクト) でない場合、エラーになります。

ノードが値を持ち、子も持つ可能性がある、私が最後に見た言語は MUMPS です。$DATA() と呼ばれる関数もあり、ノードに子 (10)、値 (1)、またはその両方 (11) があるか、存在しない (0) かを示します。それが連想配列の正しい扱いだと思います。

(とにかく、私はこの PHP の動作が気に入っています。)

于 2011-05-11T10:08:01.747 に答える
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

于 2011-05-11T09:58:16.253 に答える