Строка со структурой массива в массив

У меня строка:

Main.Sub.SubOfSub 

И некоторые данные могут быть строкой:

 SuperData 

Как я могу преобразовать все это в этот массив выше?

 Array ( [Main] => Array ( [Sub] => Array ( [SubOfSub] => SuperData ) ) 

)

Спасибо за помощь, PK

Учитывая значения

 $key = "Main.Sub.SubOfSub"; $target = array(); $value = "SuperData"; 

Вот какой-то код, который я лежал вокруг, который делает то, что вам нужно¹:

 $path = explode('.', $key); $root = &$target; while(count($path) > 1) { $branch = array_shift($path); if (!isset($root[$branch])) { $root[$branch] = array(); } $root = &$root[$branch]; } $root[$path[0]] = $value; 

Смотрите в действии .

¹ На самом деле это немного больше, чем это: он может быть тривиально инкапсулирован внутри функции и настраивается для всех трех входных значений (вы можете передать массив с существующими значениями, и при необходимости он будет расширять его).

Подобно тому, как Джон предложил (и запрашивая обратную связь в чате), ссылочный / переменный псевдоним полезен здесь, чтобы пройти динамический стек ключей. Поэтому нужно только перебрать все подразделы и, наконец, установить значение:

 $rv = &$target; foreach(explode('.', $key) as $pk) { $rv = &$rv[$pk]; } $rv = $value; unset($rv); 

Ссылка позволяет использовать стек вместо рекурсии, которая, как правило, более скудная. Кроме того, этот код предотвращает перезапись существующих элементов в массиве $target . Полный пример:

 $key = "Main.Sub.SubOfSub"; $target = array('Main' => array('Sub2' => 'Test')); $value = "SuperData"; $rv = &$target; foreach(explode('.', $key) as $pk) { $rv = &$rv[$pk]; } $rv = $value; unset($rv); var_dump($target); с $key = "Main.Sub.SubOfSub"; $target = array('Main' => array('Sub2' => 'Test')); $value = "SuperData"; $rv = &$target; foreach(explode('.', $key) as $pk) { $rv = &$rv[$pk]; } $rv = $value; unset($rv); var_dump($target); 

Вывод:

 array(1) { ["Main"]=> array(2) { ["Sub2"]=> string(4) "Test" ["Sub"]=> array(1) { ["SubOfSub"]=> string(9) "SuperData" } } } 

демонстрация

Связанный вопрос (ы):

  • добавление динамических массивов
  • Как группировать элементы массива?