@Him4enko

Как сформировать через рекурсию многомерный массив?

Мне надо по функции add('/test1/test2/test3/', 'Hello') формировать такого вида массив
Array ( [] => Array ( [test1] => Array ( [test2] => Array ( [test3] => Array ( [0] => Hello ) ) ) ) )
А при повторном вызове этой функции дополнять его в зависимости от переданных ключей.
К примеру , если вызвать второй раз add('/test1/test2/test4/', 'World');
Array ( [] => Array ( [test1] => Array ( [test2] => Array ( [test3] => Array ( [0] => Hello, [test4] => World) ) ) ) ).
Я пытался это реализовать таким образом, но он просто не дополняет.
public function add(string $keys, $value) 
    {
      if(empty($this->data)) {
        $keys_arr = explode('/', $keys);
        $tmp = &$this->data;
        foreach ($keys_arr as $key) {
            if(!end($keys_arr) == $key) {
                $tmp[$key] = [];
                $tmp = &$tmp[$key];
            }
            $tmp[$key] = [$value];
            $tmp = &$tmp[$key]; 
        }
      }
    }
  • Вопрос задан
  • 62 просмотра
Пригласить эксперта
Ответы на вопрос 3
nokimaro
@nokimaro
Меня невозможно остановить, если я смогу начать.
массив который изменяется передавать как аргемент функции
на старте передаёте пустой массив и дальше он изменяется с каждой итерацией

функция add() не является рекурсивной так как не вызывает саму себя
если нужно сохранять состояние между вызоывами метода то добавьте в классе аттрибут куда будут складываться резльтаты
Ответ написан
Комментировать
SilenceOfWinter
@SilenceOfWinter Куратор тега PHP
та еще зажигалка...
$tmp = &$this->data; значит, что $tmp указывает на то же значение что и $this->data, а не наоборот.
Ответ написан
Комментировать
gzhegow
@gzhegow
aka "ОбнимиБизнесмена"
function _array_set(array &$array, array $fullpath, $value) : void
{
    if (! $fullpath) {
        throw new InvalidArgumentException('The `fullpath` should be not-empty');
    }

    $last = array_pop($fullpath);

    $valueRef =& $array;
    while ( null !== ( $k = key($fullpath) ) ) {
         $valueRef =& $valueRef[ $fullpath[ $k ] ];

         next($fullpath);
    }

    $valueRef[ $last ] = $value;
}

$array = [];
_array_set($array, [ 1, 2, 3 ], 'abc');
var_dump($array[1][2][3]); // 'abc'
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы