Intereting Posts
Обрезаемая фатальная ошибка: объект класса mysqli не может быть преобразован в строку Можно ли написать строго типизированный PHP-код? PHP PREG_JIT_STACKLIMIT_ERROR – неэффективное регулярное выражение Как преобразовать приложение php & jqueryMobile в файл apk cUrl Вход в систему cUrl Загрузить Как преобразовать арабские символы в Unicode с помощью PHP Сингулярное декомпозиция значений (SVD) в PHP Мне нужно отлаживать PHP. Какой у меня лучший выбор? Расширение Google и PHP Счет электронной почты WooCommerce: условные «политики» на основе категории продуктов Sanitizing PHP / SQL $ _POST, $ _GET и т. Д.?? .htaccess: перенаправить все HTTP-запросы на один файл без ссылок 404 или. код Эффективное получение количества строк, возвращаемых SELECT-запросом, с предложением WHERE с использованием PDO PHP: заменить строку из определенной строки на определенную строку Как перенаправить администратора после добавления администратора?

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

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

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" } } } 

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

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

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