2013-01-16 196 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; 
            } 
            
            相關問題