PHP - 如何修改深层嵌套的关联数组?

时间:2013-06-11 02:56:40

标签: php multidimensional-array reference

我在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内的数组不会以相同的方式更新。< / p>

我一直在寻找一种方法来做几个小时,我真的不明白...... 所以请分享您可能给我的任何帮助/指示!

更新:解决方案

感谢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数组中推送/“弹出”的原因。

我最初遇到的问题实际上就是这个推送/弹出到我的部分堆栈,我无法维护对数组的引用并且不断获得副本。

感谢您的帮助:)

1 个答案:

答案 0 :(得分:1)

如果您想通过引用传递内容,请使用=&,如下所示:

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

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

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

我也看过像$currentSection = &$rootSection;这样的语法,但它们在功能上是一样的。