2016-09-28 7 views
0

私は、ファイルパス PHPは、ファイルパス文字列の配列からの値の多次元リストを作成します

Array 
(
    [0] => Array 
     (
      [0] => cat/file1.php 
     ) 

    [1] => Array 
     (
      [0] => dog/file2.php 
     ) 
    [2] => Array 
     (
      [0] => cow/file3.php 
     ) 
    [3] => Array 
     (
      [0] => cow/file4.php 
     ) 
    [4] => Array 
     (
      [0] => dog/bowl/file5.php 
     ) 

) 

、それらに基づいてファイル名を保持する単一のマルチ次元配列に変換する必要がありますを含む配列の配列を持っていますファイルパスは
Array 
(
    [cat] => Array 
     (
      [0] => file1.php 
     ) 

    [dog] => Array 
     (
      [0] => file2.php 
      [bowl] => Array 
       (
        [0] => file5.php 
       ) 

     ) 
    [cow] => Array 
     (
      [0] => file3.php 
      [1] => file4.php 
     ) 

) 

は、私は、文字列を爆発及び/ foreachのは、非再帰的/再帰的に配列を構築するためにループが、成功していないために使用して実験してきた。すなわち、これまで

+1

あなたがこれまでに試したコードを提供できますが、これはうまくいかないのですか? – rbr94

答えて

2

連想配列を反復処理するとき、特に配列値にエンコードされたフォルダ構造がある場合は、混乱することがあります。しかし、恐れや参照を使用することなく、管理することができます。ここで働い抜粋です:

$array = [ 
    ['cat/file1.php'], 
    ['dog/file2.php'], 
    ['cow/file3.php'], 
    ['cow/file4.php'], 
    ['dog/bowl/file5.php'], 
    ['dog/bowl/file6.php'], 
    ['dog/bowl/soup/tomato/file7.php'] 
]; 

$result = []; 
foreach ($array as $subArray) 
{ 
    foreach ($subArray as $filePath) 
    { 
     $folders = explode('/', $filePath); 
     $fileName = array_pop($folders); // The last part is always the filename 

     $currentNode = &$result; // referencing by pointer 
     foreach ($folders as $folder) 
     { 
      if (!isset($currentNode[$folder])) 
       $currentNode[$folder] = []; 

      $currentNode = &$currentNode[$folder]; // referencing by pointer 
     } 
     $currentNode[] = $fileName; 
    } 
} 
var_dump($result); 

結果は以下の通りです:

array(3) { 
    'cat' => 
    array(1) { 
    [0] => 
    string(9) "file1.php" 
    } 
    'dog' => 
    array(2) { 
    [0] => 
    string(9) "file2.php" 
    'bowl' => 
    array(3) { 
     [0] => 
     string(9) "file5.php" 
     [1] => 
     string(9) "file6.php" 
     'soup' => 
     array(1) { 
     'tomato' => 
     array(1) { 
      [0] => 
      string(9) "file7.php" 
     } 
     } 
    } 
    } 
    'cow' => 
    array(2) { 
    [0] => 
    string(9) "file3.php" 
    [1] => 
    string(9) "file4.php" 
    } 
} 

...あなたが望んでいる、私は推測します。

+0

完璧、ありがとう!参照の使用について考えなかった – user3495336

関連する問題