2

PHP で深くネストされた連想配列を作成する際に問題があります。あちこちで見た質問/回答から、参照を使用する必要があると収集しましたが、その方法がわかりません。

私はPHP 5.3を使用しています

JSON のようなファイルを解析しています。中括弧で囲まれたネストされた「セクション」が含まれており、ネストされた連想配列を使用してファイルのツリー表現を構築したいと考えています。

ルート セクションと「現在のセクション」変数から始めます。

$rootSection = array();
$currentSection = $rootSection;
$sections = array();

新しいセクション ('{') に入るときは、次のようにします。

$currentSection[$newSectionName] = array();
array_push($sections, $currentSection);
$currentSection = $currentSection[$newSectionName];

変数を使用して$sections、セクション ('}') からその親セクションに飛び出します。

$currentSection = array_pop($sections);

最後に、セクションにプロパティを追加したい場合は、基本的に次のようにします。

$currentSection[$name] = $value;

これまでのところ何も機能していないため、上記のコードから参照を使用しようとする試みをすべて削除しました...参照がデフォルトであるJavascriptに慣れていると言えます...

しかし、明らかにPHPには当てはまりませんか?解析コードで変数をダンプしたところ、すべてのプロパティが同じ配列に正しく追加されていることがわかりましたが、rootSection配列または内部にプッシュされた$sectionsものは同じように更新されませんでした。

私は数時間これを行う方法を探していましたが、本当にわかりません.

更新: 解決策

chrislondon のおかげで、=&もう一度使用してみましたが、なんとか機能しました。

初期コード:

$rootSection = array();
$currentSection =& $rootSection;
$sections = array();

新しいセクション ('{'):

$currentSection[$newSectionName] = array();
$sections[] =& $currentSection;
$currentSection =& $currentSection[$newSectionName];

セクションの終了 ('}'):

$currentSection =& $sections[count($sections) - 1];
array_pop($sections);

PHP 5.3 以降では、次のようなことを行うことarray_push($a, &$b);は推奨されなくなり、警告がトリガーされることに注意してください。$b =& array_pop($a)も許可されていません。そのため、[]=/演算子を使用して配列[]にプッシュ/「ポップ」しています。$sections

最初に問題があったのは、実際にはセクション スタックへのプッシュ/ポップでした。配列への参照を維持できず、常にコピーを取得していました。

ご協力いただきありがとうございます :)

4

1 に答える 1

1

参照によって何かを渡したい場合は、次=&のように使用します。

$rootSection = array();
$currentSection =& $rootSection;

$currentSection['foo'] = 'bar';

print_r($rootSection);
// Outputs: Array ( [foo] => bar )

このような構文も見ました$currentSection = &$rootSection;が、機能的には同じです。

于 2013-06-11T03:21:43.240 に答える