Проблема навигации в многомерном массиве

Metroplex

Новичок
Всех приветствую!

Вторую неделю не могу решить задачу.


------ отредактировано----------
есть файл типа:
Код:
reporting
 Default Value E_ALL
 Development Value E_ALL
 Production Value E_STRICT
 html_errors
   Default Value On
   Development Value On
   Production value On
   log_errors
    Default Value Off
    Development Value On
    Production Value On
    max_input_time 0
     Default Value -1
     Development Value 60
     Production Value 60
    output_buffering
     output_buffering 1
      Default Value: Off
      Development Value: 4096
      Production Value: 4096
     output_buffering 2
      Default Value: Off
      Development Value: 4096
      Production Value: 4096
 register_argc_argv
   Default Value On
   Development Value Off
   Production Value Off
 request_order
   Default Value None
    Development Value "GP"
     Production Value "GP"
Его нужно прочитать и выдать в результате массив вида:
array('reporting' => array('html_errors' => array(' log_errors' => array('Default Value' => 'Off'))))

---------------------------------------


Зайти в структуру на любую глубину получилось благодаря ответу fixxxer'-а

PHP:
    $result = array();
    foreach (.... => $value) {
        $ptr = &$result;
        foreach (.... as $n) {
           $ptr = &$ptr[$n];
        }
переопределением ссылки, а вот выйти?
Необходимо после заполнения значений, подняться в массив на уровень выше, чтобы продолжить заполнение.

Была мысль создать массив ссылок $path[] = &$ptr[$n] хранящий ссылки на все выше расположенные уровни, но выяснилось, что заполняется он не ссылками, а самостоятельными кусками массива $arr.

Помогите кто может, кто может помогите.
 
Последнее редактирование:

AnrDaemon

Продвинутый новичок
Вы не пробовали поставить задачу нормально? И не использовать ссылки.
 

Metroplex

Новичок
Извиняюсь.
Цель - создать описанный выше массив. Вы получаете пару $name и $value, записываете в $arr. По некоторому критерию ($value==0 например) узнаете что очередная пара это массив с именем $name, следующие пары записываются уже в массив $arr[$name][], по другому критерию, например ($value == true) запись в подмассив заканчивается и надо из него выйти на уровень выше, чтобы записывать значения в $arr.

Глубина может быть любой $arr[$name][$name][$name][$name][$name]....
 
Последнее редактирование:

AnrDaemon

Продвинутый новичок
Вам такие конструкции, как break и continue о чём-нибудь говорят?
 

AnrDaemon

Продвинутый новичок
Как обычно пишу код - молча.
Есть исходные данные, есть задача. Я сажусь и пишу код.
Вы не дали исходных данных и только очень приблизительно описали задачу.
 

AmdY

Пью пиво
Команда форума
Подобные нетривиальные решения явно указывают на неправильность выбранного пути. Расскажите подробнее зачем вам это надо (не только со стороны кода), а мы расскажем почему так делать не стоит и где у вас проблемы с хотелками. Возможно это спасёт вам жизнь в случае, когда этот код придётся поддерживать вашим коллегам.
 

fixxxer

К.О.
Партнер клуба
Либо стек, либо рекурсия (что по сути тоже стек).
 

AnrDaemon

Продвинутый новичок
Итеративно… и это не мнение, это констатация факта.
 

Metroplex

Новичок
ок, исходная задача:
есть файл типа:
Код:
reporting
 Default Value E_ALL
 Development Value E_ALL
 Production Value E_STRICT
 html_errors
   Default Value On
   Development Value On
   Production value On
   log_errors
    Default Value Off
    Development Value On
    Production Value On
    max_input_time 0
     Default Value -1
     Development Value 60
     Production Value 60
    output_buffering
     output_buffering 1
      Default Value: Off
      Development Value: 4096
      Production Value: 4096
     output_buffering 2
      Default Value: Off
      Development Value: 4096
      Production Value: 4096
 register_argc_argv
   Default Value On
   Development Value Off
   Production Value Off
 request_order
   Default Value None
    Development Value "GP"
     Production Value "GP"
Его нужно прочитать и выдать в результате массив вида:
array('reporting' => array('html_errors' => array(' log_errors' => array('Default Value' => 'Off'))))
 

Metroplex

Новичок
@fixxxer, спасибо, и за содержательные ответы в других темах тоже. Здесь я искал решение используя из структур только массивы.

@AnrDaemon, а вы, я вижу, с лора
 

fixxxer

К.О.
Партнер клуба
кроме массивов, ничего и не нужно.
array_push/array_pop

ну или рекурсия - с ней проще даже
 

AnrDaemon

Продвинутый новичок
@Metroplex, ты думать не хочешь.
Разбей весь процесс на элементарные действия и нарисуй блок-схему.
Решение на поверхности лежит.
 

Metroplex

Новичок
@AnrDaemon, перестаньте ставить мне диагнозы) Если бы я не хотел думать, я бы не пошёл писать код.
Проблема в незнании некоторых приемов обращения с массивами и ссылками.

Задачу я решил, в результате вышел знатный говнокод:

Вместо массива ссылок $path[] = &$ptr[$n]
Массив объектов $path[] = Object со свойством хранящим ссылки на развилки в многомерном массиве.

Как в стек уложить массивы в массивы в массивы, я абсолютно без понятия.
 

WMix

герр M:)ller
Партнер клуба
типа рекурсия
PHP:
function walk( $tree, $path=[] ){
    foreach( $tree as $key => $val){
        $nodepath = array_merge($path,[$key]);
        if( is_array($val) ){
            echo 'tree level: '.count($nodepath).' path: ['.implode('][', $nodepath)."]\n";
            walk( $val, $nodepath );
        }
        else{
            echo 'node val: '.$val.' level: '.count($nodepath).' path: ['.implode('][', $nodepath)."]\n";
        }
    }
}

walk([1,[2,[3,4,[5,6]]]]);
 

AnrDaemon

Продвинутый новичок
@Metroplex, начать с того, что твой формат вообще никак не стыкуется сам с собой.
Могу только предположить, что реально задача звучит совершенно иначе, и/или формат всё таки более вменяемый, чем то, что ты тут привёл.
Написать парсер можно, с push-pop получается даже компактно.
Но работать с таким форматом я бы не стал. Мне моя голова пока ещё дорога.
 
Сверху