我有字符串:
Main.Sub.SubOfSub
和某种数据,可以是字符串:
SuperData
我怎样才能把它们全部转换成上面的这个数组呢?
Array ( [Main] => Array ( [Sub] => Array ( [SubOfSub] => SuperData ) )
)谢谢你帮忙PK
iszxjhcz1#
给定值
$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;
一个月一次
¹实际上,它的作用还不止于此:它可以简单地封装在函数中,并且可以在所有三个输入值上进行配置(您可以传入一个包含现有值的数组,它将根据需要进行扩展)。
erhoui1w2#
就像Jon建议的那样(他在聊天中也要求得到反馈),引用/变量别名在遍历键的动态堆栈时很有用,所以唯一需要做的就是遍历所有的子键,最后设置值:
$rv = &$target; foreach(explode('.', $key) as $pk) { $rv = &$rv[$pk]; } $rv = $value; unset($rv);
该引用使得使用堆栈代替递归成为可能,而递归通常更精简。此外,此代码防止覆盖$target数组中的现有元素。完整示例:
$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" } } }
Demo
相关问题:
2条答案
按热度按时间iszxjhcz1#
给定值
这里有一些代码,我躺在周围,做你需要的¹:
一个月一次
¹实际上,它的作用还不止于此:它可以简单地封装在函数中,并且可以在所有三个输入值上进行配置(您可以传入一个包含现有值的数组,它将根据需要进行扩展)。
erhoui1w2#
就像Jon建议的那样(他在聊天中也要求得到反馈),引用/变量别名在遍历键的动态堆栈时很有用,所以唯一需要做的就是遍历所有的子键,最后设置值:
该引用使得使用堆栈代替递归成为可能,而递归通常更精简。此外,此代码防止覆盖
$target
数组中的现有元素。完整示例:输出:
Demo
相关问题: