2015-10-20 83 views
-1

我試着去生產這種用於JSTree目錄迭代器自定義陣列

[ 
      {"id":2,"text":"Child node 1"}, 
      {"id":3,"text":"Child node 2"}, 
      { 
       "text" : "Root node", 
       "state" : { "opened" : true }, 
       "children" : [ 
        { 
         "text" : "Child node 1", 
         "state" : { "selected" : true }, 
         "icon" : "jstree-file" 
        }, 
        { "text" : "Child node 222", "state" : { "disabled" : true } } 
       ] 
      } 
     ] 

我試着通過使用DirectoryIterator

創建此我得到了以下關閉PHP網站

$ritit = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory), FilesystemIterator::SKIP_DOTS); 
    $r = array(); 
    foreach ($ritit as $splFileInfo) { 


     $path = $splFileInfo->isDir() 
     ? array($splFileInfo->getFilename() => array()) 
     : array($splFileInfo->getFilename()); 

     for ($depth = $ritit->getDepth() - 1; $depth >= 0; $depth--) { 
     $path = array($ritit->getSubIterator($depth)->current()->getFilename() => $path); 
     } 

     $r = array_merge_recursive($r, $path); 

    } 

的此輸出

陣列 ( [] =>陣列 ( )

[..] => Array 
(
) 

[0] => Christmas.docx 
[test1] => Array 
    (
    ) 

[test2] => Array 
    (
    ) 
) 

我試了一下修改這個

$k = array(); 
foreach ($ritit as $splFileInfo) { 
    //skip if its '.' or '..' 
    if ($splFileInfo->getFilename() === '.' || $splFileInfo->getFilename() === '..') { 
    continue; 
    } 

    //if is dir 
    if($splFileInfo->isDir()) { 

     $path[] = array("text" => $splFileInfo->getFilename(), "children" => array()) ; 

     } else { 
      $path[] = array("text" => $splFileInfo->getFilename()); 

    }   

    for ($depth = $ritit->getDepth() - 1; $depth >= 0; $depth--) { 
    $path["children"] = array($ritit->getSubIterator($depth)->current()->getFilename() => $path); 
    } 

    $k = array_merge_recursive($k, $path); 

} 

而這種輸出

Array 
(
    [test2] => Array 
     (
     ) 

    [0] => Array 
     (
      [text] => Christmas.docx 
     ) 

    [1] => Array 
     (
      [text] => Christmas.docx 
     ) 

    [2] => Array 
     (
      [text] => test1 
      [children] => Array 
       (
       ) 

     ) 

    [3] => Array 
     (
      [text] => Christmas.docx 
     ) 

    [4] => Array 
     (
      [text] => test1 
      [children] => Array 
       (
       ) 

     ) 

    [5] => Array 
     (
      [text] => test2 
      [children] => Array 
       (
       ) 

     ) 

) 

請你能幫助我與我」米意味着要做的迭代通過文件結構並返回一個數組,我可以在開始的帖子轉換成json?


更新

信貸:https://stackoverflow.com/a/3556894/1842842

我有現在這樣:

function requestAccountFolderStructure($dir) { 
    $list = array(); 
    $path = $dir; 
    $i = 0; 
    foreach (new DirectoryIterator($path) as $file) { 
     if ($file->isDot()) 
      continue; 

     if ($file->isDir()) { 
      $record = array(); 
      $record['id'] = $i; 
      $record['text'] = $file->getFilename(); 
      $record['children'] = array();    
      $record['path'] = $file->getPathInfo()->getFilename();    
      if (is_dir($dir . '/' . $file)) { 
       $record['children'] = requestAccountFolderStructure($dir . '/' . $file); 
      } 
      $list[] = $record; 
      $i++; 
     } 

    } 
    return $list; 
} 

    $dir = 'folder/'; 
    $directories = requestAccountFolderStructure($dir); 

    foreach($directories as $directory){ 
     //if(count($directory['children'] === 1)){ 
      $dir = new DirectoryIterator('folder/' . $directory['text']); 
      foreach ($dir as $fileinfo) { 
     if (!$fileinfo->isDir()) { 
        $directories[$directory['id']]['children'][] = array("text" => $fileinfo->getFilename(),"icon" => "jstree-file"); 
     } 
      } 
     //}  
    } 

    print_r(json_encode($directories)); 

這對我產生

[{"id":0,"text":"test1","children":[{"text":"1.docx","icon":"jstree-file"}],"path":"folder"},{"id":1,"text":"test2","children":[{"id":0,"text":"New folder","children":[],"path":"test2"},{"text":"2.txt","icon":"jstree-file"}],"path":"folder"}] 

我只需要圖出去馬國王它的子文件夾,子迭代現在

+1

「我只需要弄清楚它現在在子子文件夾中迭代」 - 閱讀遞歸,應該這樣做。 – Avalanche

+0

感謝:D到達那裏(添加答案),並與我明白的代碼!我遇到了麻煩(仍不明白它)與此行'$路徑=數組($ ritit-> getSubIterator($深度) - >當前() - > getFilename()=> $路徑); ' – user1842842

回答

0

信用:https://stackoverflow.com/a/952324/1842842

此代碼

$fileData = convertDirectoryToArray(new DirectoryIterator('folder/')); 

function convertDirectoryToArray(DirectoryIterator $dir) 
{ 
    $data = array(); 
    foreach ($dir as $node) 
    { 
    if ($node->isDir() && !$node->isDot()) 
    { 
     $test = array(); 
     $test['text'] = $node->getFilename(); 
     $test['children'] = convertDirectoryToArray(new DirectoryIterator($node->getPathname())); 

     $data[] = $test; 
    } 
    else if ($node->isFile()) 
    { 
     $test= array(); 
     $test['text'] = $node->getFilename(); 
     $test['icon'] = "jstree-file"; 
     $data[] = $test; 
    } 
    } 
    return $data; 
} 

print_r(json_encode($fileData)); 

產生

[{"text":"Christmas.docx"},{"text":"test1","children":[{"text":"1.docx"}]},{"text":"test2","children":[{"text":"2.txt"},{"text":"New folder","children":[{"text":"4.txt"}]}]}] 

這正是我一直在尋找!