PHP:先对文件夹排序,然后对文件排序

PHP:先对文件夹排序,然后对文件排序,php,sorting,directory,Php,Sorting,Directory,如何先对文件夹进行排序,然后对文件进行排序?您不需要进行两次循环,您可以使用以下代码完成此工作: images (folder) index.html javascript (folder) style.css 试试这个: <?php function scandirSorted($path) { $sortedData = array(); foreach(scandir($path) as $file) { // Skip the . a

如何先对文件夹进行排序,然后对文件进行排序?

您不需要进行两次循环,您可以使用以下代码完成此工作:

images (folder)
index.html    
javascript (folder)
style.css
试试这个:

<?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;
}

?>
$dir='/master/files';
$directories=array();
$files_list=array();
$files=scandir($dir);
foreach($files作为$file){
如果(($file!='.')&($file!='.')){
if(is_dir($dir./'.$file)){
$directories[]=$file;
}否则{
$files\u list[]=$file;
}
}
}
foreach($directory作为$directory){
回显“
  • ”.$directory.
  • ”; } foreach($files\u列表为$file\u列表){ 回显“
  • ”.$file\u列表。”
  • ; }
    尽可能少地修改代码:

    $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>';
    }
    
    $folder_list=”“;
    $file_list=“”;
    $dir='/master/files';
    $files=scandir($dir);
    foreach($files作为$file){
    如果(($file!='.')&($file!='.')){
    if(is_dir($dir./'.$file)){
    $folder_list.='
  • '.$file.
  • '; }否则{ $file_list.='
  • '.$file.
  • '; } } } 打印$folder\u列表; 打印$file\u列表;

    这只需在所有内容中循环一次,而不需要多次循环。

    将输出存储在两个数组中,然后遍历数组,以正确的顺序输出它们

    $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;
    
    $dir='/master/files';
    $contents=scandir($dir);
    //创建空白数组以存储文件夹和文件
    $folders=$files=array();
    foreach($file形式的内容){
    如果(($file!='.')&($file!='.')){
    if(is_dir($dir./'.$file)){
    //添加到文件夹阵列
    $folders[]=$file;
    }否则{
    //添加到文件数组
    $files[]=$file;
    }
    }
    }
    //输出文件夹
    foreach($folders作为$folder){
    回显“
  • ”.$folder.
  • ”; } //输出文件 foreach($files作为$file){ 回显“
  • ”.$file.
  • ”; }
    试试看


    我有一个N深度递归目录扫描的解决方案:

    <?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);
    ?>
    

    作为一名CodeIgniter爱好者,我实际上修改了core目录_helper,除了设置深度和选择是否应包含隐藏文件外,还可以使某些文件免于扫描

    所有功劳都归于词的原始作者。我只是加了一句 在排序中使用豁免数组和构建

    它使用ksort对文件夹进行排序,因为文件夹名称被设置为键,而natsort对每个文件夹中的文件进行排序

    您可能需要做的唯一一件事是为您的环境定义目录分隔符,但我认为您不需要修改太多其他内容

    function scanRecursively($dir = "/") {
        $scan = array_diff(scandir($dir), array('.', '..'));
        $tree = array();
        $queue = array();
        foreach ( $scan as $item ) 
            if ( is_file($item) ) $queue[] = $item;
            else $tree[] = scanRecursively($dir . '/' . $item);
        return array_merge($tree, $queue);
    }
    
    如上所述,它将文件夹名称设置为子数组的键,因此您可以预期以下内容:

    $filelist = directory_map('full_server_path');
    

    请记住,豁免将应用于所有文件夹。如果您想跳过index.html文件或不希望包含的目录中使用的其他文件,这很方便。

    首先将它们保存在两个数组中,然后打印它们(首先是文件夹,然后是文件):)您的意思是我必须创建两个“foreach”?一个用于文件夹,然后用于文件?我认为两个foreach不好,在创建数组时保存li,然后使用内爆打印更好在循环中键入是个好主意,但这不会对文件夹或文件进行排序
    a-z
    顺序。实际上,如果顺序很重要,则必须使用两个数组
    function scanRecursively($dir = "/") {
        $scan = array_diff(scandir($dir), array('.', '..'));
        $tree = array();
        $queue = array();
        foreach ( $scan as $item ) 
            if ( is_file($item) ) $queue[] = $item;
            else $tree[] = scanRecursively($dir . '/' . $item);
        return array_merge($tree, $queue);
    }
    
    function directory_map($source_dir, $directory_depth = 0, $hidden = FALSE, $exempt = array())
    {
        if ($fp = @opendir($source_dir))
        {
            $folddata   = array();
            $filedata   = array();
            $new_depth  = $directory_depth - 1;
            $source_dir = rtrim($source_dir, DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR;
    
            while (FALSE !== ($file = readdir($fp)))
            {
                // Remove '.', '..', and hidden files [optional]
                if ($file === '.' OR $file === '..' OR ($hidden === FALSE && $file[0] === '.'))
                {
                    continue;
                }
    
                is_dir($source_dir.$file) && $file .= DIRECTORY_SEPARATOR;
    
                if (($directory_depth < 1 OR $new_depth > 0) && is_dir($source_dir.$file))
                {
                    $folddata[$file] = directory_map($source_dir.$file, $new_depth, $hidden, $exempt);
    
                }
                elseif(empty($exempt) || !empty($exempt) && !in_array($file, $exempt))
                {
                    $filedata[] = $file;
                }
            }
    
            !empty($folddata) ? ksort($folddata) : false;
            !empty($filedata) ? natsort($filedata) : false;
    
            closedir($fp);
            return array_merge($folddata, $filedata);
        }
    
        return FALSE;
    }
    
    $filelist = directory_map('full_server_path');
    
    Array(
    [documents/] => Array(
        [0] => 'document_a.pdf',
        [1] => 'document_b.pdf'    
        ),
    [images/] => Array(
        [tn/] = Array(
            [0] => 'picture_a.jpg',
            [1] => 'picture_b.jpg'
            ),
        [0] => 'picture_a.jpg',
        [1] => 'picture_b.jpg'        
        ),
    [0] => 'file_a.jpg',
    [1] => 'file_b.jpg'
    );