2011-12-16 113 views
7

我有串:字符串数组结构阵列

Main.Sub.SubOfSub 

有些类型的数据,可能是一个字符串:

SuperData 

我如何这一切转化为这阵上面?

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

    ) 

感谢您的帮助, PK

+0

$ tmp_array = explode('。',$ your_string);然后遍历$ tmp_array并创建你的$ k数组 – djot 2011-12-16 16:34:24

回答

11

给出的值

$key = "Main.Sub.SubOfSub"; 
$target = array(); 
$value = "SuperData"; 

下面是一些代码,我已经躺在附近已经做了你need¹什么:

$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。它实际上可以做得稍微多一点:它可以简单地封装在一个函数内部,并且可以在所有三个输入值上进行配置(您可以将数组传递给具有现有值的数组,并且可以根据需要扩展它) 。

4

就像乔恩建议的(并在询问聊天中的反馈)中,引用/变量别名在这里有助于遍历动态堆栈键。因此,唯一需要的就是遍历所有子项,并最终设定值:

$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

相关问题(S):