У меня возникли проблемы с созданием глубоко вложенного ассоциативного массива в 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
, не будут обновляться одинаково.
Я искал способ сделать это в течение нескольких часов, и я действительно не понимаю ... Поэтому, пожалуйста, поделитесь с нами любой помощью/указателями!
UPDATE: Решение
Благодаря chrislondon я попытался с помощью =&
снова, и сумел заставить его работать.
Init код:
$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 для моего стека разделов, я не мог поддерживать ссылку на массив и постоянно получал копию.
Спасибо за вашу помощь :)
Лучший способ проанализировать потенциально бесконечные уровни иерархии - использовать рекурсию. Что касается ссылок, все объекты передаются по ссылке в PHP. Массивов нет. Вероятно, вам следует избегать использования ссылок, если вы не уверены, что они вам нужны. –
@StevenMoseley Я разбираю файл с помощью lexer/scanner, который я специально сгенерировал для него (используя JLexPHP). Он разбивает содержимое файла на токены для меня, и при каждом новом токене '{' или '}' я выполняю код, указанный в моем вопросе. Поэтому мне нужно поддерживать состояние «где» я в дереве файлов, вот что мои '' '' $ rootSection'', '' '' $ sections'' и '' '$ currentSection''' предназначены для , Поскольку они представляют собой те же массивы, которые были нажаты/назначены в разных местах в зависимости от моего состояния парсера, я * делаю * нужны ссылки :) –