PHP - 自动创建多维数组

Mat*_*att 2 php associative-array multidimensional-array

所以这是输入:

$in['a--b--c--d'] = 'value';
Run Code Online (Sandbox Code Playgroud)

和期望的输出:

$out['a']['b']['c']['d'] = 'value';
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?我没有运气就试过以下代码......


$in['a--b--c--d'] = 'value';
// $str = "a']['b']['c']['d";
$str = implode("']['", explode('--', key($in)));
${"out['$str']"} = 'value';
Run Code Online (Sandbox Code Playgroud)

Mar*_*iot 8

这似乎是递归的主要候选者.

基本方法如下:

  1. 创建一个键数组
  2. 为每个键创建一个数组
  3. 当没有更多键时,返回值(而不是数组)

下面的递归就是这样,在每次调用期间创建一个新数组,列表中的第一个键被指定为新值的键.在下一步中,如果还有键,则重复该过程,但是当没有键时,我们只返回该值.

$keys = explode('--', key($in));

function arr_to_keys($keys, $val){
    if(count($keys) == 0){
        return $val;
    }
    return array($keys[0] => arr_to_keys(array_slice($keys,1), $val));
}

$out = arr_to_keys($keys, $in[key($in)]);
Run Code Online (Sandbox Code Playgroud)

对于您的示例,上面的代码将评估为与此等效的内容(但适用于任意数量的--分隔项的一般情况):

$out = array($keys[0] => array($keys[1] => array($keys[2] => array($keys[3] => 'value'))));
Run Code Online (Sandbox Code Playgroud)

或者用更明确的术语来构造以下内容:

$out = array('a' => array('b' => array('c' => array('d' => 'value'))));
Run Code Online (Sandbox Code Playgroud)

这允许您通过所需的索引访问每个子数组.