我有一个字符串数组,格式如下:
$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 :(得分: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 ...
祝其他人好运