PHP - Как изменить глубоко вложенные ассоциативные массивы?

У меня проблемы с созданием глубоко вложенного ассоциативного массива в 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 массив.

Изначально у меня были проблемы с этим push/pop для моего стека секций, я не мог поддерживать ссылку на массив и постоянно получал копию.

Спасибо за вашу помощь:)

1 ответ

Решение

Если вы хотите передать что-то по ссылке, используйте =& как это:

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

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

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

Я также видел такой синтаксис $currentSection = &$rootSection; но они функционально одинаковы.

Другие вопросы по тегам