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(: