Я создаю 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-массив из набора ключей