【问题标题】:String with array structure to Array [duplicate]具有数组结构的字符串到数组[重复]
【发布时间】:2012-01-22 03:44:23
【问题描述】:

我有字符串:

Main.Sub.SubOfSub

还有某种数据,可能是字符串:

SuperData

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

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

    )

)

感谢您的帮助, PK

【问题讨论】:

标签: php arrays string algorithm multidimensional-array


【解决方案1】:

给定值

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

See it in action

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

【讨论】:

    【解决方案2】:

    就像 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

    相关问题:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-04
      • 2015-07-09
      • 1970-01-01
      • 2015-03-23
      • 2013-08-04
      • 1970-01-01
      • 2017-03-17
      相关资源
      最近更新 更多