具有数组结构的字符串转换为数组

7

我有一个字符串:

Main.Sub.SubOfSub

还有一些数据,可能是一个字符串:

SuperData

我该如何将所有内容转换为以上的数组?
Array
(
[Main] => Array
    (
        [Sub] => Array
            (
                [SubOfSub] => SuperData
            )

    )

感谢您的帮助, PK

$tmp_array = explode('.', $your_string); 然后遍历 $tmp_array 并创建你的 $k 数组。 - djot
请查看http://php.net/manual/en/function.explode.php和http://php.net/manual/en/function.implode.php,你就快到家了。 - Cyclonecode
类似的问题,只是针对 stdClass 对象,而不是数组:数组转对象 - hakre
2个回答

12

给定以下值

$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;

在此处查看它的运行情况

¹实际上,它所做的略微超过了这个:它可以轻松地封装在一个函数内,并且可以配置三个输入值(您可以传入一个带有现有值的数组,并根据需要扩展它)。


5

像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"
    }
  }
}

演示

相关问题:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接