使用 opendir() 和 readdir() 控制文件的顺序


Control the order of the files with opendir() & readdir()

我检查了 php.net opendir((,但没有发现无法控制opendir((获取的文件顺序。

我有一个幻灯片,但在控制图像顺序时遇到问题。我尝试更改名称并使用01.img02.img ,..., 20.img但没有成功。

我的脚本:

<?php
$path2 = "./img/";
function createDir($path2 = './img'){   
    if ($handle = opendir($path2)){
        echo "<ul class='"ad-thumb-list'">";
        while (false !== ($file = readdir($handle))){
            if (is_dir($path2.$file) && $file != '.' && $file !='..')
                printSubDir($file, $path2, $queue);
            else if ($file != '.' && $file !='..')
                $queue[] = $file;
        }
        printQueue($queue, $path2);
        echo "</ul>";
    }
}
function printQueue($queue, $path2){
    foreach ($queue as $file){
        printFile($file, $path2);
    } 
}
function printFile($file, $path2){
    if ($file=="thumbs.db") {echo "";}
    else{
        echo "<li><a href='"".$path2.$file."'">";
        echo "<img src='"".$path2.$file."'" class='thumbnail'></a></li>";
    }
}
/*function printSubDir($dir, $path2)
{
}*/
createDir($path2);
?>

使用 scandir(( 和 natsort((。

重写的代码:

function createDir($path2 = './img'){   
    $dirContents = scandir($path2);
    natsort($dirContents);
    echo "<ul class='"ad-thumb-list'">";
    // You should actually add the line below!
    // $queue = array();    
    foreach ($dirContents as $entry) {
      if ($entry == '.' || $entry == '..') {
        continue;
      }
      $entryPath = $path2 . $entry;
      if (is_dir($entryPath)) {
        printSubDir($entry, $path2, $queue);
      }
      else {
        $queue[] = $entry;
      }
    }
    printQueue($queue, $path2);
    echo "</ul>";
  }
}

如果你使用的是 PHP 5,你可以尝试使用 scandir(( 代替。 它有一个排序的参数。

http://us1.php.net/scandir

array scandir ( string $directory [, int $sorting_order = SCANDIR_SORT_ASCENDING [, resource $context ]] )

正如@Steven已经说过的,您可能无法更改opendir()的输出,但是没有什么可以阻止您之后对数组进行排序。

为此,请查看 natsort() 函数,该函数旨在正确排序字符串,例如用于文件名的字符串。