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;
но они функционально одинаковы.