【问题标题】:How to build a array that contains a folder structure?如何构建包含文件夹结构的数组?
【发布时间】:2012-12-30 18:26:12
【问题描述】:

我想构建一个 Json 输出来列出 ExtJS 树面板中的文件夹结构。结构应该相当于Json中的这个数组:

Array
(
    [text] => .
    [children] => Array
        (
            [0] => Array
                (
                    [text] => files
                    [children] => 
                )

            [1] => Array
                (
                    [text] => folder 1
                    [children] => 
                )

            [2] => Array
                (
                    [text] => New directory
                    [children] => array(
                        [0] => Array
                            (
                                [text] => sub_1
                                [children] => array(
                                    [0] => Array
                                        (
                                            [text] => sub_1_1
                                            [children] => 
                                        )
                                    [1] => Array
                                        (
                                            [text] => sub_1_2
                                            [children] => 
                                        )                                    
                                )
                            )
                        [1] => Array
                            (
                                [text] => sub_2
                                [children] => 
                            )                             
                    )
                )    
        )    
)

我通过PHP手册和示例制作了这个显示结构的函数

listFolders('../file_uploads/');
function listFolders($dir){
    $dh = scandir($dir);
    echo '<ul>';
    foreach($dh as $folder){
        if($folder != '.' && $folder != '..')
        {
            if(is_dir($dir.'/'.$folder)){
                echo '<li>'.$folder.'</li>';
                listFolders($dir.'/'.$folder);
            }
        }
    }
    echo '</ul>';
}

这会输出结构

  • 新目录
    • sub_1
      • sub_1_1
        • sub_1_1_1
        • sub_1_2
        • sub_2
        • 文件
          • 文件夹 1

            我想知道如何将此输出转换为上述数组(或 Json)?

            解决方案

            print "<pre>";
            print_r(listFolders('../file_uploads/'));
            
            function listFolders($dir)
            {
                $dh = scandir($dir);
                $return = array();
            
                foreach ($dh as $folder) {
                    if ($folder != '.' && $folder != '..') {
                        if (is_dir($dir . '/' . $folder)) {
                            $return[] = array(
                                'text' => $folder,
                                'children' => listFolders($dir . '/' . $folder)
                            );
                        }
                    }
                }
                return $return;
            }
            

            【问题讨论】:

            • 为什么需要在数组中?
            • 我想构建一个 json 输出来列出 extjs 树面板中的文件夹结构

            标签: php json


            【解决方案1】:

            试试下面的代码:

            function listFolders($dir)
            {
                $dh = scandir($dir);
                $return = array();
            
                foreach ($dh as $folder) {
                    if ($folder != '.' && $folder != '..') {
                        if (is_dir($dir . '/' . $folder)) {
                            $return[] = array($folder => listFolders($dir . '/' . $folder));
                        } else {
                            $return[] = $folder;
                        }
                    }
                }
                return $return;
            }
            

            似乎对我有用,但没有正确测试。

            【讨论】:

            • 谢谢,这会创建嵌套数组,但知道如何使用此函数获取键值对,就像我发布的数组一样?
            • 玩了一段时间这个功能,并想出了如何得到我需要的准确输出。谢谢
            • @VladPreda 任何提供如何使用迭代器类获得相同结果的方法?感谢您对stackoverflow.com/questions/24121723/… 的任何帮助
            • @YahyaE:回答了你的问题
            • @VladPreda 马上检查,感谢您的时间。
            【解决方案2】:
            <?php
            error_reporting(0);
            
            $array_folders  = listFolders('../file_uploads/');
            echo "<pre>";
            print_r($array_folders);
            
            function listFolders($dir){
                global $ret_array;
                $dh = scandir($dir);
                foreach($dh as $folder){
                    if($folder != '.' && $folder != '..')
                    {
                        if(is_dir($dir.'/'.$folder)){
                            $ret_array[$dir][]  = $folder;
                            listFolders($dir.'/'.$folder);
                        }
                    }
                }
                return $ret_array;
            }
            ?>
            

            【讨论】:

              【解决方案3】:

              首先创建一个数组。对于每个创建的目录,使用 array_push 到数组?

              还可以查看http://php.net/manual/en/function.scandir.php 上的 cmets。

              【讨论】:

              • 几乎没有答案。您可以通过向 OP 展示一些代码示例来改进吗?这将如何创建一个嵌套数组?
              • 试过了,但不知道如何将子目录推送到相关的主目录中
              【解决方案4】:

              我认为您正在寻找递归目录列表。使用下面的代码,希望对您有所帮助。它对我有用。

              <?php
              /**
               * Function for recursive directory file list search as an array.
               *
               * @param mixed $dir Main Directory Path.
               *
               * @return array
               */
              function listFolderFiles($dir)
              {
                  $fileInfo     = scandir($dir);
                  $allFileLists = [];
              
                  foreach ($fileInfo as $folder) {
                      if ($folder !== '.' && $folder !== '..') {
                          if (is_dir($dir . DIRECTORY_SEPARATOR . $folder) === true) {
                              $allFileLists[$folder . '/'] = listFolderFiles($dir . DIRECTORY_SEPARATOR . $folder);
                          } else {
                              $allFileLists[$folder] = $folder;
                          }
                      }
                  }
              
                  return $allFileLists;
              }//end listFolderFiles()
              
              
              $dir = listFolderFiles('your searching directory path ex:-F:\xampp\htdocs\abc');
              echo '<pre>';
              print_r($dir);
              echo '</pre>'
              
              ?>
              

              【讨论】:

                【解决方案5】:

                要获得完全相同的结果,请遵循以下代码

                function listFolderFiles($dir){
                    $ffs = scandir($dir);
                
                    unset($ffs[array_search('.', $ffs, true)]);
                    unset($ffs[array_search('..', $ffs, true)]);
                
                    // prevent empty ordered elements
                    //if (count($ffs) < 1)
                    //    return;
                
                
                    $dirStrArr = array();
                    foreach($ffs as $ff){
                        if(is_dir($dir.'/'.$ff)) {
                            $dirStrArr[]=array('parent' => $ff, 'children' => listFolderFiles($dir . '/' . $ff));
                        }else{
                            $dirStrArr[]=$ff;
                        }
                    }
                    return $dirStrArr;
                }
                

                或者要获取文件夹名称作为索引以及索引数组中的子详细信息,您可以按照以下代码进行

                function listFolderFiles($dir){
                    $ffs = scandir($dir);
                
                    unset($ffs[array_search('.', $ffs, true)]);
                    unset($ffs[array_search('..', $ffs, true)]);
                
                    // prevent empty ordered elements
                    //if (count($ffs) < 1)
                    //    return;
                
                
                    $dirStrArr = array();
                    foreach($ffs as $ff){
                        if(is_dir($dir.'/'.$ff)) {
                            $dirStrArr[$ff]=listFolderFiles($dir . '/' . $ff);
                        }else{
                            $dirStrArr[]=$ff;
                        }
                    }
                    return $dirStrArr;
                }
                

                【讨论】:

                  猜你喜欢
                  • 2018-09-29
                  • 1970-01-01
                  • 1970-01-01
                  • 2016-08-11
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多