我有一个字符串:
Main.Sub.SubOfSub
还有一些数据,可能是一个字符串:
SuperData
我该如何将所有内容转换为以上的数组?
Array
(
[Main] => Array
(
[Sub] => Array
(
[SubOfSub] => SuperData
)
)
感谢您的帮助, PK
我有一个字符串:
Main.Sub.SubOfSub
还有一些数据,可能是一个字符串:
SuperData
Array
(
[Main] => Array
(
[Sub] => Array
(
[SubOfSub] => SuperData
)
)
给定以下值
$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;
¹实际上,它所做的略微超过了这个:它可以轻松地封装在一个函数内,并且可以配置三个输入值(您可以传入一个带有现有值的数组,并根据需要扩展它)。
像Jon建议的那样(并在聊天中征求反馈),引用/变量别名有助于遍历动态密钥堆栈。因此,唯一需要的就是迭代所有子键,最终设置值:
$rv = &$target;
foreach(explode('.', $key) as $pk)
{
$rv = &$rv[$pk];
}
$rv = $value;
unset($rv);
$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"
}
}
}
相关问题:
stdClass
对象,而不是数组:数组转对象。 - hakre