我正在从PHP数组中创建JSON编码数据,这些数据可以是两层或三层深层,看起来像这样:
[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数组中,然后再将它们编码为一次,这样就可以解决问题了)
编辑:我意识到我可以在代码中执行此操作:$options['grandparent']['parent']['child'] = "myValue1";
$options['grandparent']['parent']['child2'] = "myValue2";
$options['grandparent']['parent']['child3'] = "myValue3";
哪个可能更简单;但是一个建议仍然会摇摆(因为我使用它作为更广泛的对象的一部分,所以它的$obj->setOption(key,value);
答案 0 :(得分:8)
如果尚未创建子阵列并相应地设置关键字( codepad here ),则应该为您填充子阵列:
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
...但希望这可以提供一个开始的地方!
答案 1 :(得分:0)
$option = setOption("grandParent", { parent:{ child:"myValue" } });
怎么样?
如果之前未设置$options['grandparent']['parent']['child']
,则执行$options['grandparent']['parent']
会产生错误。
答案 2 :(得分:0)
接受答案的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;
}
}
答案 3 :(得分:0)
@rjz解决方案帮助了我,因为我需要从存储在数组中的一组键创建一个数组,但是当它涉及数字索引时,它没有用。对于那些需要从数组中的数组索引存储创建嵌套数组的人,如下所示:
$keys = array(
'variable_data',
'0',
'var_type'
);
您可以在此处找到解决方案:Php array from set of keys