Intereting Posts
Почему строки в $ _POST не могут содержать точку "."? как и когда использовать токен обновления с php google calender api Удалить index.php? Route = common / home из OpenCart Новый API-интерфейс с графическим API-интерфейсом – Приложение не отображается mPDF – результат PHP с переменными через буфер PHP mySQL – вставить новую запись в таблицу с автоматическим приращением на первичный ключ Получить данные из массива объекта массива в laravel Загрузка файла YII без добавления в базу данных с использованием формы Как перенаправить пользователей настольных компьютеров от мобильного сайта с помощью PHP PHP preg_match UUID v4 Плохой запрос с использованием file_get_contents для запроса PUT в PHP Серьезность: предупреждение: ftp_chmod () : Разрешения изменены Как я могу получить атрибут xml <yt: accesscontrol>? jQuery AJAX POST для таблицы mysql для динамических табличных данных. Я делаю это как угодно? Добавление url () прерывает реализацию hook_mail

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

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

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

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

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

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