首页 > 解决方案 > 通过递归函数在php中打印树视图

问题描述

我有一个关于文件夹的树数组。我想把它打印成一棵树。您可以看到如下数组:

[
  {
    "name": "C:\\xampp\\htdocs\\test\\test.php",
    "type": "file",
    "priority": 1
  },
  {
    "name": "C:\\xampp\\htdocs\\test\\test.txt",
    "type": "file",
    "priority": 1
  },
  {
    "name": "C:\\xampp\\htdocs\\test\\test1",
    "type": "folder",
    "priority": 0,
    "subfolders": [
      {
        "name": "C:\\xampp\\htdocs\\test\\test1\\test2",
        "type": "folder",
        "priority": 0,
        "subfolders": [
          {
            "name": "C:\\xampp\\htdocs\\test\\test1\\test2\\test4",
            "type": "folder",
            "priority": 0,
            "subfolders": [
              {
                "name": "C:\\xampp\\htdocs\\test\\test1\\test2\\test4\\test5..txt",
                "type": "file",
                "priority": 1
              }
            ]
          },
          {
            "name": "C:\\xampp\\htdocs\\test\\test1\\test2\\test6.txt",
            "type": "file",
            "priority": 1
          }
        ]
      },
      {
        "name": "C:\\xampp\\htdocs\\test\\test1\\test3.txt",
        "type": "file",
        "priority": 1
      }
    ]
  },
  {
    "name": "C:\\xampp\\htdocs\\test\\test_1.php",
    "type": "file",
    "priority": 1
  }
]

我用这个函数创建了这个数组:

function getDirContents($dir, &$results = array(), $counter = 0 ) {
    $files = scandir($dir);

    foreach ($files as $key => $value) {
        $path = realpath($dir . DIRECTORY_SEPARATOR . $value);
        if (!is_dir($path)) {
            $results[] = array('name'=>$path,'type'=>'file', 'priority'=>1);
            
            //echo $path;
        } else if ($value != "." && $value != "..") {

            $results[] = array('name'=>$path,'type'=>'folder','priority'=>0,'subfolders'=>array());
            
            getDirContents($path, $results[count($results)-1]['subfolders']);
            
        }

    }

    return $results;
}



我用这个函数打印这个数组:

function printGetDirContents($tree,$counter = 1){
    
    foreach ($tree as $key => $value) {
        
        if($value['type']=='folder'){

            
            
            echo str_repeat('-',$counter*2).$value['name'];
            $counter = $counter + 1;
            echo '<br><br>';
            printGetDirContents($value['subfolders']);
            
            

        }
        
        if($value['type']=='file'){
            
            echo str_repeat('-',$counter*2).$value['name'];
            echo '<br><br>';
            
        }
    }
}


当我打印时,我得到这个结果:

--C:\xampp\htdocs\test\test.php

--C:\xampp\htdocs\test\test.txt

--C:\xampp\htdocs\test\test1 <---
--C:\xampp\htdocs\test\test1\test2

--C:\xampp\htdocs\test\test1\test2\test4

--C:\xampp\htdocs\test\test1\test2\test4\test5..txt

----C:\xampp\htdocs\test\test1\test2\test6.txt

----C:\xampp\htdocs\test\test1\test3.txt <---

----C:\xampp\htdocs\test\test_1.php

如您所见,它不是完全的树形视图。因为 test1/test3.txt 应该低于 test1/ 但到目前为止。我尝试用文件对数组进行排序,文件优先级为1,文件夹优先级为0。但它不起作用,这里的排序结果:

$tree = getDirContents('./');
$priority = array_column($tree,'priority');
array_multisort($priority,SORT_DESC,$tree);
printGetDirContents($tree); 

结果:

--C:\xampp\htdocs\test\test.php

--C:\xampp\htdocs\test\test.txt

--C:\xampp\htdocs\test\test_1.php

--C:\xampp\htdocs\test\test1

--C:\xampp\htdocs\test\test1\test2

--C:\xampp\htdocs\test\test1\test2\test4

--C:\xampp\htdocs\test\test1\test2\test4\test5..txt

----C:\xampp\htdocs\test\test1\test2\test6.txt

----C:\xampp\htdocs\test\test1\test3.txt


我哪里错了?你能帮助我吗 ?谢谢...

标签: phprecursiontreeview

解决方案


推荐阅读