从爆炸字符串生成动态数组

时间:2012-01-24 20:01:21

标签: php arrays string explode

我有一个字符串数组,格式如下:

$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()
    )
)

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

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

2 个答案:

答案 0 :(得分: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);

此代码可能无法很好地处理空元素(例如/user//4//////test),具体取决于您的要求。

答案 1 :(得分: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中的键存在,该路径链接到我们所在的结果中的当前步骤。在每个循环中,我们创建缺少的键并将其初始化为array(),然后使用引用将该新数组保存为新的$ path ...

祝其他人好运