2013-06-11 3 views
2

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

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

+1

Лучший способ проанализировать потенциально бесконечные уровни иерархии - использовать рекурсию. Что касается ссылок, все объекты передаются по ссылке в PHP. Массивов нет. Вероятно, вам следует избегать использования ссылок, если вы не уверены, что они вам нужны. –

+0

@StevenMoseley Я разбираю файл с помощью lexer/scanner, который я специально сгенерировал для него (используя JLexPHP). Он разбивает содержимое файла на токены для меня, и при каждом новом токене '{' или '}' я выполняю код, указанный в моем вопросе. Поэтому мне нужно поддерживать состояние «где» я в дереве файлов, вот что мои '' '' $ rootSection'', '' '' $ sections'' и '' '$ currentSection''' предназначены для , Поскольку они представляют собой те же массивы, которые были нажаты/назначены в разных местах в зависимости от моего состояния парсера, я * делаю * нужны ссылки :) –

ответ

1

Если вы хотите что-то передать по эталонным использования =& так:

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

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

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

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

+0

Спасибо @chrislondon! Это то, что я пытался использовать, но после некоторого времени проблемы (и немного спящего!) Я снова повторил этот указатель и смог заставить его работать :) Я обновлю свой вопрос с помощью решения. –

Смежные вопросы