0

次のコードを使用して、ディレクトリとそのサブディレクトリの配列を取得しています。それぞれにファイルの種類の拡張子が含まれています: png. それはうまく機能しますが、配列の結果をリストスタイル形式で出力できるようにする必要があります。

* Test
  -> test2.png
  -> test1.png
  * subfolder
    -> test3.png
    * sub sub folder
      -> test4.png

コード:

$filter=".png";  
$directory='../test';  
$it=new RecursiveDirectoryIterator("$directory");
foreach(new RecursiveIteratorIterator($it) as $file){  
    if(!((strpos(strtolower($file),$filter))===false)||empty($filter)){  
        $items[]=preg_replace("#\\\#", "/", $file);  
    }
}

結果の配列の例:

array (
  0 => '../test/test2.png',
  1 => '../test/subfolder/subsubfolder/test3.png',
  2 => '../test/subfolder/test3.png',
  3 => '../test/test1.png',
)

望ましい結果を達成するための最良の方法は何でしょうか?

4

2 に答える 2

0

あなたのif節で、試してください:

$items[]=preg_replace("#\\\#", "/", $file->getPathName());

これにより、希望する出力に近い出力が得られるはずです。ただし、getPathName絶対パスを出力します。

于 2010-03-23T13:21:14.770 に答える
0

ディレクトリの前にファイルを表示したい場合、後でファイルが表示されるかどうかわからないため、単純にループで表示することはできません。

データをツリー (パス コンポーネントによってインデックス付けされた配列の配列) に集約するか、並べ替える必要があります。

$components = explode('/',$path);
$file = array_pop($components);
$current = $root;
foreach($components as $component) {
  if (!isset($current[$component])) $current[$component] = array();
  $current = &$current[$component];
}
$current[$file] = true;

次のような構造が得られるはずです。

array(
  'test'=>array(
      'test1.png'=>true,
      'subfolder'=>array(
      … 

それは簡単に操作できます(もちろん、それは の目的に反します。regular をRecursiveDirectoryIterator再帰的に使用することで同じことを得ることができますDirectoryIterator)。

または、深さでパスを並べ替える (比較関数を作成する) 場合は、最後のパス コンポーネントを適切なインデントで出力するだけで出力できます。

于 2010-12-13T13:35:16.640 に答える