List and Sort Files with PHP DirectoryIterator

前端 未结 2 1056
遇见更好的自我
遇见更好的自我 2020-12-19 04:31

I\'m using DirectoryIterator to generate a linked-list of PDF files. (There\'s also some code to break up the file name to make the list more user friendly.) I\'d like to so

相关标签:
2条回答
  • 2020-12-19 05:17

    Use scandir instead of DirectoryIterator to get a sorted list of files:

    $path = "../images/";
    
    foreach (scandir($path) as $file){
    
        if($file[0] == '.'){continue;}//hidden file
    
        if( is_file($path.$file) ){
    
        }else if( is_dir($path.$file) ){
    
        }
    }
    

    scandir is case sensitive. For case insensitive sorting, see this answer: How do you scan the directory case insensitive?

    0 讨论(0)
  • 2020-12-19 05:20

    Placing your valid files into an array with various columns you can sort by is probably the best bet, an associate one at that too.

    I used asort() "Sort an array and maintain index association" with I think best fits your requirements.

    if (is_dir($path)) 
    {
        $FoundFiles = [];
    
        foreach (new DirectoryIterator($path) as $file) 
        {
    
           if ($file->isDot())
           {
              continue;
           }
        
           $fileName = $file->getFilename();
    
           $pieces    = explode('.', $fileName);
           $date      = explode('-', $pieces[2]);
                    
           $filetypes = [ "pdf", "PDF" ];
           $filetype  = pathinfo( $file, PATHINFO_EXTENSION );
    
           if ( in_array( strtolower( $filetype ), $filetypes )) 
           {
              /** 
               *  Place into an Array
              **/
              $foundFiles[] = array( 
                  "fileName" => $fileName,
                  "date"     => $date
              );       
           }
        }
     }
    

    Before Sorting

    print_r( $foundFiles );
    
    Array
    (
       [0] => Array
           (
                [fileName] => readme.pdf
                [date] => 22/01/23
           )
    
       [1] => Array
           (
                [fileName] => zibra.pdf
                [date] => 22/01/53
           )
    
        [2] => Array
           (
                [fileName] => animate.pdf
                [date] => 22/01/53
           ) 
    )
       
    
            
    

    After Sorting asort()

    /** 
     *   Sort the Array by FileName (The first key)
     *   We'll be using asort()
    **/ 
    asort( $foundFiles );
    
    /** 
     *   After Sorting 
    **/ 
    print_r( $foundFiles );
    
    Array
    (
        [2] => Array
            (
                [fileName] => animate.pdf
                [date] => 22/01/53
            )
    
        [0] => Array
            (
                [fileName] => readme.pdf
                [date] => 22/01/23
            )
    
        [1] => Array
            (
                [fileName] => zibra.pdf
                [date] => 22/01/53
            )
     )
    

    Then for printing with HTML after the function completes - Your code did it whilst the code was in a loop, which meant you couldn't sort it after it's already been printed:

    <ul>
       <?php foreach( $foundFiles as $file ): ?>
          <li>File: <?php echo $file["fileName"] ?> - Date Uploaded: <?php echo $file["date"]; ?></li>
       <?php endforeach; ?>
    </ul>
    
    0 讨论(0)
提交回复
热议问题