2012-01-24 34 views
-1

动态数组我有一个字符串数组被格式化这样的:生成爆炸串

$strings = array(
    "/user", 
    "/robot", 
    "/user/1", 
    "/user/2", 
    "/user/2/test", 
    "/robot/1" 
); 

我需要做的就是把它变成以下结构的阵列,当我print_r()它:

Array 
(
    [user] => Array (
    [1] => array(), 
    [2] => Array (
     [test] => array() 
    ) 
    [robot] => Array (
     [1] => array() 
    ) 
) 

我知道我需要用分隔符/来分解原始字符串。然而,我的问题是如何构建动态数组。

请注意,字符串可能会有无限量的斜杠。

+0

想想递归。例如,您可以将每个原始元素分解一次,然后将分解数组传递给一个函数,该函数将沿着树向下导航,直至到达分解数组的最后一个元素,此时它将插入该元素。 – Tim

+2

仅供参考,我猜这是因为它是[“gimme teh codez”](http://meta.stackexchange.com/q/108551/164291)问题而被下调的。 – 2012-01-24 20:16:15

回答

2

在遍历列表时,可以使用引用逐步构建数组。

$strings = array(
    "/user", 
    "/robot", 
    "/user/1", 
    "/user/2", 
    "/user/2/test", 
    "/robot/1" 
); 

$extracted = array(); 

foreach($strings as $string) 
{ 
    $pos =& $extracted; 
    foreach(explode('/', ltrim($string, '/')) as $split) 
    { 
    if(! isset($pos[$split])) 
    { 
     $pos[$split] = array(); 
    } 

    $pos =& $pos[$split]; 
    } 
} 

print_r($extracted); 

此代码可能无法处理空元素非常好(例如,),根据您的要求。

+0

不错,贴在同一时间和解决方案是完全一样的......干杯凤凰 –

+0

@MathieuDumoulin你有一个很好的解释,并且有两种方法之间的差异,希望至少会给OP从这个小练习中学到一些东西的机会。你也从我这里得到一个+1(: – 2012-01-24 20:17:04

1

下面的一段代码应该给你你寻找或非常接近的...

$result = array(); 
foreach($strings as $string){ 

    $exploded = explode('/', substr($string, 1)); 
    $path = &$result; 

    foreach($exploded as $explodedpart){ 
     if(!array_key_exists($explodedpart, $path)){ 
      $path[$explodedpart] = array(); 
     } 
     $path = &$path[$explodedpart]; 
    } 
} 

初始化数组,然后循环中的所有字符串和爆炸他们在/(除第一个)。然后,设置对结果数组第一级的初始引用。注意&,这个算法继续前进至关重要。

然后,循环您爆炸的字符串的每个部分,检查零件是否存在于与当前步骤中当前步骤相关的当前$路径中的键中。在每个循环中,我们创建缺少的关键,它初始化数组(),然后采取新的阵列,通过参考其保存为新的$ PATH ...

好运气,其余