У меня строка:
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" } } }
демонстрация
Связанный вопрос (ы):