2013-10-02 48 views
0

例如價值觀,我有數組簡單數組關聯數組,基於「目錄樹」喜歡的第一個

Array 
(
    [0] => folder1/file1.txt 
    [1] => folder1/file2.txt 
    [2] => file2.txt 
    [3] => folder2/file1.txt 
    [4] => folder1/subfolder1/file1.txt 
    [5] => folder1/subfolder2/file2.txt 
    [6] => file1.txt 
    [7] => file3.txt 
    [8] => folder1/subfolder2/file1.txt 
) 

我需要一個線索人物如何創建「目錄樹」陣列,基於在給定的值,它可能看起來像這樣:

Array 
(
    [folder1] => Array 
     (
      [0] => file1.txt 
      [1] => file2.txt 
      [subfolder1] => Array 
       (
        [0] => file1.txt 
       ) 

      [subfolder2] => Array 
       (
        [0] => file1.txt 
        [1] => file2.txt 
       ) 

     ) 

    [0] => file1.txt 
    [1] => file2.txt 
    [2] => file3.txt 
) 

現在第二個數組是第一個數組的樹(手動)。 =)

而我不知道如何自動實現這一點。

+0

可能的誘惑[http://stackoverflow.com/questions/8479543/php-how-to-populate-a-directory-structure-in-an-array](http://stackoverflow.com/questions/ 8479543/PHP-如何到填充-A-目錄 - 結構 - 在-一個陣列)? –

+0

@Kristen Jukowski該主題涉及真正的文件和目錄,我沒有 –

+1

@KristenJukowski該問題始於遞歸目錄迭代器,此問題以平面數組開頭。我很確定我回答了一個類似的問題,我試圖找到它。 – Barmar

回答

1

Simples例子(demo),就像你希望將生成輸出,但你會得到衝突,如果你將擁有相同的文件夾和文件名在同一目錄級別(demo)。

$files = [ 
    'folder1/file1.txt', 
    'folder1/file2.txt', 
    'file2.txt', 
    'folder2/file1.txt', 
    'folder1/subfolder1/file1.txt', 
    'folder1/subfolder2/file2.txt', 
    'file1.txt', 
    'file3.txt', 
    'folder1/subfolder2/file1.txt', 
]; 

$tree = []; 
foreach ($files as $file) { 
    $a = explode('/', $file); 
    $array = &$tree; 
    foreach (array_slice($a, 0, -1) as $folder) { 
     if (!isset($array[$folder])) $array[$folder] = []; 
     $array = &$array[$folder]; 
    } 
    $array[] = end($a); 
} 
print_r($tree); 

爲了克服同一個文件夾並命名上,你可以在最後創建斜線文件夾的索引,就像folder/同級別文件的問題,所以不能有任何衝突(demo)。

+0

thanx很多,男人 –

+0

'你可以創建文件夾索引'你的意思是空文件夾? –

+0

不,我的意思是,如果你有一個文件夾,數組索引將以斜槓作爲'文件夾/'。並且還支持空文件夾。 [實施例](https://eval.in/52021)。 –