Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.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_File_Parsing_Recursion - Fatal编程技术网

在PHP中将文件放入嵌套数组

在PHP中将文件放入嵌套数组,php,file,parsing,recursion,Php,File,Parsing,Recursion,我有一个这种格式的txt文件 -Main --Sub --Next sub ---Sub Sub --Last sub -Next Main -Last Main --Sub --Next sub 我需要把它转换成嵌套数组 Array( "Main" => array("Sub","Next sub" => array("Sub Sub")), ); 在PHP中是否有递归函数可以实现这一点? 非常感谢我认为简单地分解文件内容就可以了,这样您就可以开始了: $file = fop

我有一个这种格式的txt文件

-Main
--Sub
--Next sub
---Sub Sub
--Last sub
-Next Main
-Last Main
--Sub
--Next sub
我需要把它转换成嵌套数组

Array(
 "Main" => array("Sub","Next sub" => array("Sub Sub")),
);
在PHP中是否有递归函数可以实现这一点?
非常感谢

我认为简单地分解文件内容就可以了,这样您就可以开始了:

$file = fopen('path/to/file.txt', "r");
$array = explode('/r',$file);

它是基本的,但从这里开始,您可以将其操作到嵌套数组中。

可能不是很漂亮,但代码可以工作

    $str = "
-Main
--Sub level 2
--Next sub level 2
---Sub Sub1 level 3
---Sub Sub2 level 3
--Last sub level 2
-Next Main
-Last Main
--Sub level 2
--Next sub level 2
--Next sub level 2
--Next sub level 2
---Next sub1 level 3
---Next sub2 level 3
---Next sub3 level 3
--Next sub level 2
-Next sub
--Next sub level 2
--Next sub level 2
";
$a = explode("\n", $str);
$last_count = 1;
$level = array();
$level1 = array();
$level2 = array();
$level3 = array();
$max_level = 0;
$min_level = 1;

foreach($a as $key => $val)
{
$count = substr_count($val, '-');
if ($max_level < $count)
{
$max_level = $count;
}
}

foreach($a as $key => $val)
{
$count = substr_count($val, '-');
$val = trim($val, '-');
if ($count > 0)
{
if ($count == $min_level)
{
$level1[] = $level2;
if ($last_count == 2)
{
$level1[] = $val;
}

$level1[] = $level2;
$level2 = array();
$level1[] = $val;
}
elseif ($count == ($max_level - 1) && ($last_count >= $min_level))
{
if ($last_count == $max_level)
{
array_pop($level2);
$level2[$name2] = $level3;
$level3 = array();
}

$level2[] = $val;
$name2 = $val;
}
elseif ($count == $max_level && ($last_count >= ($min_level + 1)))
{
$level3[] = $val;
}

$last_count = $count;
}
}

$level1[] = $level2;
$level1 = array_filter($level1);
$arr = array();

foreach($level1 as $key)
{
$arr[$var] = is_array($key) ? $key : '';
$var = $key;
}

$arr = array_filter($arr);
echo '<pre>';
print_r($arr);
echo '</pre>';

您可能需要再次检查返回的内容
 Array
(
    [Main] => Array
        (
            [0] => Sub level 2
            [Next sub level 2] => Array
                (
                    [0] => Sub Sub1 level 3
                    [1] => Sub Sub2 level 3
                )

            [1] => Last sub level 2
        )

    [Last Main] => Array
        (
            [0] => Sub level 2
            [1] => Next sub level 2
            [2] => Next sub level 2
            [Next sub level 2 ] => Array
                (
                    [0] => Next sub1 level 3
                    [1] => Next sub2 level 3
                    [2] => Next sub3 level 3
                )

            [3] => Next sub level 2
        )

    [Next sub] => Array
        (
            [0] => Next sub level 2
            [1] => Next sub level 2
        )

)