8
$dir = '/master/files';
$files = scandir($dir);
foreach($files as $file){
   if(($file != '.') && ($file != '..')){
      if(is_dir($dir.'/'.$file)){
         echo '<li class="folder">'.$file.'</li>';
      }else{
         echo '<li class="file">'.$file.'</li>';
      }
   }
}

上記のスクリプトから、結果が得られます。

images (folder)
index.html    
javascript (folder)
style.css

最初にフォルダを並べ替えてからファイルを並べ替えるにはどうすればよいですか?

4

7 に答える 7

9

これを試して :

$dir = '/master/files';
$directories = array();
$files_list  = array();
$files = scandir($dir);
foreach($files as $file){
   if(($file != '.') && ($file != '..')){
      if(is_dir($dir.'/'.$file)){
         $directories[]  = $file;

      }else{
         $files_list[]    = $file;

      }
   }
}

foreach($directories as $directory){
   echo '<li class="folder">'.$directory.'</li>';
}
foreach($files_list as $file_list){
   echo '<li class="file">'.$file_list.'</li>';
}
于 2013-02-25T05:07:37.523 に答える
4

2 つのループを作成する必要はありません。次のコードで作業を行うことができます。

<?php

function scandirSorted($path) {

    $sortedData = array();
    foreach(scandir($path) as $file) {

        // Skip the . and .. folder
        if($file == '.' || $file == '..')
            continue;            

        if(is_file($path . $file)) {
            // Add entry at the end of the array
            array_push($sortedData, '<li class="folder">' . $file . '</li>');
        } else {
            // Add entry at the begin of the array
            array_unshift($sortedData, '<li class="file">' . $file . '</li>');
        }
    }
    return $sortedData;
}

?>

この関数は、最初にフォルダー、次にファイルのパスのエントリのリストを返します。

于 2013-02-25T05:07:23.310 に答える
3

コードをできるだけ変更しない:

$folder_list = "";
$file_list = "";
$dir = '/master/files';
$files = scandir($dir);
foreach($files as $file){
   if(($file != '.') && ($file != '..')){
      if(is_dir($dir.'/'.$file)){
         $folder_list .= '<li class="folder">'.$file.'</li>';
      }else{
         $file_list .= '<li class="file">'.$file.'</li>';
      }
   }
}

print $folder_list;
print $file_list;

これは、複数のパスを必要とするのではなく、すべてを 1 回だけループします。

于 2013-02-25T05:08:20.960 に答える
1

出力を 2 つの配列に格納し、配列を反復処理して正しい順序で出力します。

$dir = '/master/files';

$contents = scandir($dir);

// create blank arrays to store folders and files
$folders = $files = array();

foreach ($contents as $file) {

    if (($file != '.') && ($file != '..')) {

        if (is_dir($dir.'/'.$file)) {

            // add to folders array
            $folders[] = $file;

        } else {

            // add to files array
            $files[] = $file;

        }
    }
}

// output folders
foreach ($folders as $folder) {

    echo '<li class="folder">' . $folder . '</li>';

}

// output files
foreach ($files as $file) {

    echo '<li class="file">' . $file . '</li>';

}
于 2013-02-25T05:09:03.060 に答える
0

試す

<?php
    $path = $_SERVER['DOCUMENT_ROOT'];
    chdir ($path);

    $dir = array_diff (scandir ('.'), array ('.', '..', '.DS_Store', 'Thumbs.db'));

    usort ($dir, create_function ('$a,$b', '
        return  is_dir ($a)
        ? (is_dir ($b) ? strnatcasecmp ($a, $b) : -1)
        : (is_dir ($b) ? 1 : (
            strcasecmp (pathinfo ($a, PATHINFO_EXTENSION), pathinfo ($b, PATHINFO_EXTENSION)) == 0
            ? strnatcasecmp ($a, $b)
            : strcasecmp (pathinfo ($a, PATHINFO_EXTENSION), pathinfo ($b, PATHINFO_EXTENSION))
        ))
    ;
'));

    header ('content-type: text/plain');
    print_r ($dir);
?>
于 2013-02-25T05:10:20.863 に答える