2016-04-06 10 views
0

私はディレクトリツリーを再帰的に反復する関数を持っています。 これはうまくいく、私はディレクトリとファイルで返される配列を取得します。再帰ディレクトリiteratorサブフォルダを持つファイルのファイルパスを取得

   $dir = 'files'; 
       function dirToArray($dir) { 

        $result = array(); 

        $cdir = scandir($dir); 
        foreach ($cdir as $key => $value) { 

         if (!in_array($value,array(".",".."))) { 
         if (is_dir($dir . DIRECTORY_SEPARATOR . $value)) { 
          $result[$value] = dirToArray($dir . DIRECTORY_SEPARATOR . $value); 
         } 
         else { 
          $result[] = $value; 
         } 
         } 
        } 

        return $result; 
       } 

私はその後ウィッヒも正常に動作し、ユーザーに私の素敵なメニュー構造を表示するためにreturntedアレイの上recursivly繰り返します。

   function printAll($arr) { 

        if(!is_array($arr)) { 
         echo '<li><div class="sub_menu_path"></div><a href="'.$arr.'" class="file"><i class="fa fa-fw fa-file-text-o"></i>'.$arr.'</a></li>'; 
        } 
        else { 

         foreach($arr as $k => $v) { 

          if(is_array($v)) { 
           echo '<li><div class="sub_menu_path"></div><a href="'.$k.'" class="multi_menu folder"><i class="fa fa-fw fa-folder-o"></i>'.$k.'</a>';       

           echo '<ul class="sub_menu">';        
            printAll($v);        
           echo '</ul>'; 

           echo '</li>'; 
          } 
          else { 
           echo '<li><div class="sub_menu_path"></div><a href="'.$v.'" class="file"><i class="fa fa-fw fa-file-text-o"></i>'.$v.'</a></li>';         
          } 
         } 
        } 
       }    

       printall(dirToArray($dir)); 

結果:

enter image description here

しかし、私は、サブフォルダを含む完全なパスを取得する方法HTML <a href="$value">$value</a>でユーザにwraptファイルを表示したときに私がしたいことはありますか?例えば:files/Products/Cress/Ramnunculus/Introduction/file.txt 私はfile.txtを得ます。 file.txtをクリックすると、ofcourseが見つかりません。

EDIT(ソリューション):

答えで提案されているように、私は追加のパラメータを追加しました。 変数$v$kに変更しました。これは文字列変換に配列を与えるためです。

  function printAll($arr, $path = '') { 

        if(!is_array($arr)) { 
         echo '<li><div class="sub_menu_path"></div><a href="'.$arr.'" class="file"><i class="fa fa-fw fa-file-text-o"></i>'.$arr.'</a></li>'; 
        } 
        else { 

         foreach($arr as $k => $v) { 

          $file_path = $path . ($path == '' ? '' : '/') . $k; 

          if(is_array($v)) { 
           echo '<li><div class="sub_menu_path"></div><a href="" class="multi_menu folder"><i class="fa fa-fw fa-folder-o"></i>'.$k.'</a>'; 

           echo '<ul class="sub_menu">';        
            printAll($v, $file_path);        
           echo '</ul>'; 

           echo '</li>'; 
          } 
          else { 
           echo '<li><div class="sub_menu_path"></div><a href="'.$file_path.'" class="file"><i class="fa fa-fw fa-file-text-o"></i>'.$v.'</a></li>';         
          } 
         } 
        } 
       }    

       printall(dirToArray($dir)); 

答えて

2

$path = ''

function printAll($arr, $path = '') { 

     if(!is_array($arr)) { 
      $file_path = $path . ($path == '' ? '' : '/') . $arr; 
      echo '<li><div class="sub_menu_path"></div><a href="'.$file_path.'" class="file"><i class="fa fa-fw fa-file-text-o"></i>'.$arr.'</a></li>'; 
     } 
     else { 

      foreach($arr as $k => $v) { 
       if(is_array($v)) { 
        $file_path = $path . ($path == '' ? '' : '/') . $k; 

        echo '<li><div class="sub_menu_path"></div><a href="'.$file_path.'" class="multi_menu folder"><i class="fa fa-fw fa-folder-o"></i>'.$k.'</a>'; 

        echo '<ul class="sub_menu">'; 
        printAll($v, $file_path); 
        echo '</ul>'; 

        echo '</li>'; 
       } 
       else { 
        $file_path = $path . ($path == '' ? '' : '/') . $v; 
        echo '<li><div class="sub_menu_path"></div><a href="'.$file_path.'" class="file"><i class="fa fa-fw fa-file-text-o"></i>'.$v.'</a></li>'; 
       } 
      } 
     } 
    } 
+0

オプションのパラメータを含めるこれは私にエラーを与える:文字列変換 – Julez

+0

編集に配列を:私は$ kに$ Vを変更し、今では動作します。多くの人に感謝します。それはとても簡単だったことを知っている。 – Julez

+0

あなたは私にそれを泥炭で、あなたの配列構造で正しく動作するように私のコードを変更しました:)乾杯! – Siffer

関連する問題