2

我正在从 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);

4

4 回答 4

9

如果尚未创建子数组并相应地设置键(此处为键盘),这应该为您填充子数组:

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在您的班级中使用...但希望这提供了一个开始的地方!

于 2012-05-09T15:48:34.183 回答
0

怎么样$option = setOption("grandParent", { parent:{ child:"myValue" } });

如果之前没有设置,doing$options['grandparent']['parent']['child']会产生错误。$options['grandparent']['parent']

于 2012-05-09T15:44:20.393 回答
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;                        
    }

  }
于 2012-05-09T16:19:05.150 回答
0

@rjz 解决方案帮助了我,尽管我需要从存储在数组中的一组键创建一个数组,但是当涉及到数字索引时,它不起作用。对于那些需要从数组中存储的数组索引集创建嵌套数组的人,如下所示:

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

你会在这里找到解决方案:Php array from set of keys

于 2012-05-26T11:28:40.270 回答