拆分字符串以形成多维数组键?

时间:2012-05-09 15:21:23

标签: php arrays

我正在从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 个答案:

答案 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