带数组结构的数组

我有string:

Main.Sub.SubOfSub 

而某种数据,可能是一个string:

 SuperData 

我怎么能把它全部转换到这个数组上面?

 Array ( [Main] => Array ( [Sub] => Array ( [SubOfSub] => SuperData ) ) 

感谢您的帮助,PK

给定值

 $key = "Main.Sub.SubOfSub"; $target = array(); $value = "SuperData"; 

这里有一些代码,我已经躺在那做你需要¹:

 $path = explode('.', $key); $root = &$target; while(count($path) > 1) { $branch = array_shift($path); if (!isset($root[$branch])) { $root[$branch] = array(); } $root = &$root[$branch]; } $root[$path[0]] = $value; 

看到它的行动

¹实际上,它可以做得稍微多一点:它可以简单地封装在一个函数中,并且可以在所有三个input值上进行configuration(您可以传递一个具有现有值的数组,并且会根据需要进行扩展)。

就像Jon所build议的(并且在聊天时要求反馈),引用/variables别名在这里有助于遍历dynamic密钥栈。 所以唯一需要的是遍历所有的子键,最后设置值:

 $rv = &$target; foreach(explode('.', $key) as $pk) { $rv = &$rv[$pk]; } $rv = $value; unset($rv); 

该引用使得可以使用堆栈而不是通常更精简的recursion。 此外,此代码可以防止覆盖$target数组中的现有元素。 完整的例子:

 $key = "Main.Sub.SubOfSub"; $target = array('Main' => array('Sub2' => 'Test')); $value = "SuperData"; $rv = &$target; foreach(explode('.', $key) as $pk) { $rv = &$rv[$pk]; } $rv = $value; unset($rv); var_dump($target); 

输出:

 array(1) { ["Main"]=> array(2) { ["Sub2"]=> string(4) "Test" ["Sub"]=> array(1) { ["SubOfSub"]=> string(9) "SuperData" } } } 

演示

相关问题:

  • dynamic数组键添加
  • 如何分组数组元素?