Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从分解的字符串生成动态数组_Php_Arrays_String_Explode - Fatal编程技术网

Php 从分解的字符串生成动态数组

Php 从分解的字符串生成动态数组,php,arrays,string,explode,Php,Arrays,String,Explode,我有一个字符串数组,其格式如下: $strings = array( "/user", "/robot", "/user/1", "/user/2", "/user/2/test", "/robot/1" ); 我需要做的是,当我打印它时,将其转换为以下结构的数组: Array ( [user] => Array ( [1] => array(), [2] => Array ( [test] => ar

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

$strings = array(
   "/user",
   "/robot",
   "/user/1",
   "/user/2",
   "/user/2/test",
   "/robot/1"
);
我需要做的是,当我打印它时,将其转换为以下结构的数组:

Array
(
  [user] => Array (
    [1] => array(),
    [2] => Array (
      [test] => array()
    )
  [robot] => Array (
      [1] => array()
    )
)
我知道我需要用分隔符分解原始字符串。然而,我的问题是如何构建动态数组


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

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

$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
),具体取决于您的需求。

下面的代码应该能提供您所需的内容或非常接近的内容

$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


祝其他人好运

反复思考。例如,您可以将每个原始元素分解一次,然后将分解后的数组传递到一个函数中,该函数将沿树向下导航,直到到达分解数组的最后一个元素,此时它将插入该元素。仅供参考,我猜这被否决了,因为这是一个问题。很好,在同一时间发布,解决方案完全相同。。。干杯phoenix@MathieuDumoulin你的解释很好,这两种方法之间存在一些差异,希望至少能让OP有机会从这个小练习中学到一些东西。你也从我这里得到+1(: