2013-01-16 140 views
2

我想构建一个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; 
            } 
            

            enter image description here

            +0

            为什么你需要它在一个数组? – Gordon

            +0

            我想建立一个JSON输出列出一个ExtJS的树面板 –

            回答

            6

            试试下面的代码:

            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; 
            } 
            

            似乎为我工作,没有测试但正常。

            +0

            谢谢,这将创建嵌套的数组,但任何想法如何获得键值对与像数组我发布这个功能呢? –

            +0

            打了这个功能,而并想出如何得到真实出来放我所需要的。感谢 –

            +0

            高兴它帮助。 –

            1

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

            也看看http://php.net/manual/en/function.scandir.php的意见。

            +1

            很难回答里面的文件夹结构。你可以通过向OP显示一些代码示例来改进吗?这将如何创建一个嵌套的数组? – Gordon

            +0

            试过,但不知道如何推动子目录到相关的主目录 –

            1
            <?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; 
            } 
            ?> 
            
            0

            我想你正在寻找一个递归目录列表。使用下面的代码我希望它能帮助你。这个对我有用。

            <?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>' 
            
            ?> 
            
            0

            要得到完全相同的结果就可以了,跟着娄代码

            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; 
            } 
            
            相关问题