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

xcitsw88  于 2023-03-16  发布在  PHP
关注(0)|答案(2)|浏览(148)

我有字符串:

Main.Sub.SubOfSub

和某种数据,可以是字符串:

SuperData

我怎样才能把它们全部转换成上面的这个数组呢?

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

    )


谢谢你帮忙PK

iszxjhcz

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;

一个月一次

¹实际上,它的作用还不止于此:它可以简单地封装在函数中,并且可以在所有三个输入值上进行配置(您可以传入一个包含现有值的数组,它将根据需要进行扩展)。

erhoui1w

erhoui1w2#

就像Jon建议的那样(他在聊天中也要求得到反馈),引用/变量别名在遍历键的动态堆栈时很有用,所以唯一需要做的就是遍历所有的子键,最后设置值:

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

该引用使得使用堆栈代替递归成为可能,而递归通常更精简。此外,此代码防止覆盖$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

相关问题:

相关问题