2014-03-04 81 views
0

我我的本地WAMP的服務器上運行此腳本和BlueHost的PHP執行opendir文件排序

$dir = "../DB" 
// Open a directory, and read its contents 
if (is_dir($dir)){ 
    if ($dh = opendir($dir)){ 
    while (($file = readdir($dh)) !== false){ 
     echo "filename:" . $file . "<br>"; 
    } 
    closedir($dh); 
    } 
} 

在我的本地主機我得到這個輸出是按字母順序排列。

filename:. 
filename:.. 
filename:Autumn.xml 
filename:background.xml 
filename:backgroundclipsettings.xml 
filename:Balloons.xml 
filename:Beach.xml 
filename:boy.xml 
filename:boys.xml 
filename:Christmas.xml 
filename:city.xml 
filename:clip 
filename:clip.xml 

但是在Bluehost上,我得到這個訂單,我不知道什麼是標準。

filename:SwirlsPink.xml 
filename:OldPaper Orange.xml 
filename:OldPaper Green.xml 
filename:Lets Celebrate.xml 
filename:Outdoor Activities.xml 
filename:.. 
filename:Spring.xml 
filename:Neutral.xml 
filename:. 
filename:SwirlsGreen.xml 
filename:Sports.xml 

有誰能告訴我該怎麼做才能在bluehost中按字母順序排序,爲什麼我會得到不同的結果?

+1

沒有申請執行opendir/readdir的排序,並且這些文件中的任何(隨機)讀命令底層文件系統吐出來。使用'glob'代替默認排序 - 或者通過先將條目放到數組中然後再排序數組來實現自己的排序。 – CBroe

+0

我不能使用它,因爲我的函數是遞歸的,每次調用後我都使用文件夾的名稱。 –

回答

1

我不能告訴你爲什麼得到不同的結果(?不同的文件系統導致不同的結果)...

對列表進行排序,然而,唯一的選擇是創建一個包含所有文件的中間陣列:

$dir = "../DB"; 
$allfiles = array(); 
// Open a directory, and read its contents 
if (is_dir($dir)){ 
    if ($dh = opendir($dir)){ 
    while (($file = readdir($dh)) !== false){ 
     $allfiles[] = $file; 
    } 
    closedir($dh); 
    } 
} 
sort($allfiles); 
foreach($allfiles as $file) { 
    echo "filename:" . $file . "<br>"; 
} 

編輯:

這個版本是遞歸的:

function printFoldersRecursive($dir) 
{ 
    $allfiles = array(); 

    // Open a directory, and read its contents 
    if (is_dir($dir)){ 
     if ($dh = opendir($dir)){ 
      while (($file = readdir($dh)) !== false){ 
       if($file != '.' && $file != '..') { 
        $allfiles[] = $file; 
       } 
      } 
      closedir($dh); 
     } 
    } 

    sort($allfiles); 

    foreach($allfiles as $file) { 
     echo "filename:" . $dir.'/'.$file . "<br>\n"; 
     if(is_dir($dir.'/'.$file)){ 
      printFoldersRecursive($dir.'/'.$file); 
     } 
    } 
} 

printFoldersRecursive('../DB'); 
+0

我不能在數組之後使用排序,因爲我的函數是遞歸的,並且我根據它的級別獲取文件名。 –

+0

@aminelasfar「基於他們的水平」是什麼意思?無論如何,這也可以做到這一點遞歸功能 – Qualcuno

+0

我的意思是通過父級目錄的子級。對於每個目錄,我需要查看它的子文件夾並再次對其執行相同的操作。 –

1

如果使用scandir可以指定排序順序:

$dir = "../DB" 
if (is_dir($dir)) { 
    $files = scandir($dir, SCANDIR_SORT_ASCENDING); 
    foreach($file in $files) { 
    echo "filename:" . $file . "<br>"; 
    } 
}