Разделить строку для формирования многомерных ключей массива?

Я создаю JSON-кодированные данные из массивов PHP, которые могут быть двумя или тремя уровнями глубины, которые выглядят примерно так:

[grandParent] => Array ( [parent] => Array ( [child] => myValue ) ) 

Метод, который я имею, просто для создания вложенного массива вручную в коде, требует от меня использовать мою функцию «setOption» (которая обрабатывает кодировку позже) путем ввода некоторых ужасных вложенных массивов:

 $option = setOption("grandParent",array("parent"=>array("child"=>"myValue"))); 

Я хотел бы получить тот же результат, используя аналогичную запись в javascript в этом экземпляре, потому что я собираюсь задать множество параметров на многих страницах, и выше просто не очень читаемо, особенно когда вложенные массивы содержат несколько ключи, тогда как возможность сделать это имеет смысл:

 $option = setOption("grandParent.parent.child","myValue"); 

Может ли кто-нибудь предложить способ создать многомерный массив, разделив строку на «.». так что я могу json_encode () его во вложенный объект?

(назначение функции setOption состоит в том, чтобы собрать все параметры вместе в один большой вложенный массив PHP, прежде чем кодировать их все за один раз позже, так что там будет решение)

EDIT: Я понимаю, что могу сделать это в коде:

 $options['grandparent']['parent']['child'] = "myValue1"; $options['grandparent']['parent']['child2'] = "myValue2"; $options['grandparent']['parent']['child3'] = "myValue3"; 

Что может быть проще; но предложение все равно будет качаться (поскольку я использую его как часть более широкого объекта, поэтому его $obj->setOption(key,value);

Это должно заполнить под-массивы для вас, если они еще не созданы и не установлены соответствующие ключи ( код здесь ):

 function set_opt(&$array_ptr, $key, $value) { $keys = explode('.', $key); // extract the last key $last_key = array_pop($keys); // walk/build the array to the specified key while ($arr_key = array_shift($keys)) { if (!array_key_exists($arr_key, $array_ptr)) { $array_ptr[$arr_key] = array(); } $array_ptr = &$array_ptr[$arr_key]; } // set the final key $array_ptr[$last_key] = $value; } 

Назовите это так:

 $opt_array = array(); $key = 'grandParent.parent.child'; set_opt($opt_array, $key, 'foobar'); print_r($opt_array); 

В соответствии с вашими изменениями вы, вероятно, захотите адаптировать это, чтобы использовать array в своем классе … но, надеюсь, это дает вам возможность начать!

Как насчет $option = setOption("grandParent", { parent:{ child:"myValue" } }); ?

Выполнение $options['grandparent']['parent']['child'] приведет к ошибке, если раньше $options['grandparent']['parent'] не был установлен.

Версия OO принятого ответа (http://codepad.org/t7KdNMwV)

  $object = new myClass(); $object->setOption("mySetting.mySettingsChild.mySettingsGrandChild","foobar"); echo "<pre>".print_r($object->options,true)."</pre>"; class myClass { function __construct() { $this->setOption("grandparent.parent.child","someDefault"); } function _setOption(&$array_ptr, $key, $value) { $keys = explode('.', $key); $last_key = array_pop($keys); while ($arr_key = array_shift($keys)) { if (!array_key_exists($arr_key, $array_ptr)) { $array_ptr[$arr_key] = array(); } $array_ptr = &$array_ptr[$arr_key]; } $array_ptr[$last_key] = $value; } function setOption($key,$value) { if (!isset($this->options)) { $this->options = array(); } $this->_setOption($this->options, $key, $value); return true; } } 

Решение @rjz помогло мне, поэтому мне нужно было создать массив из набора ключей, хранящихся в массиве, но когда дело дошло до числовых индексов, оно не сработало. Для тех, кому нужно создать вложенный массив из набора индексов массивов в массиве, как здесь:

 $keys = array( 'variable_data', '0', 'var_type' ); 

Вы найдете решение здесь: Php-массив из набора ключей