2010-12-02 4 views
4

scandir에 대한 PHP 설명서 : 기본적으로 정렬 된 순서는 오름차순으로 알파벳순입니다..PHP scandir 결과 : 폴더 파일별로 정렬하고 알파벳순으로 정렬

Windows에서 파일 브라우저를 구축 중이므로 주소가 폴더/파일별로 정렬 된 다음 해당 하위 집합에서 알파벳순으로 반환됩니다.

예 : 바로 지금, 스캔 및 출력

Aardvark.txt 
BarDir 
BazDir 
Dante.pdf 
FooDir 

내가 (나 자신을 알아낼 수 있음) usortis_dir() 솔루션 이외의

BarDir 
BazDir 
FooDir 
Aardvark.txt 
Dante.pdf 

를 원하는,이 이렇게 신속하고 효율적인 방법?

this comment을 작성한 닌자가 올바른 길에 있습니다. 이것이 최선의 방법입니까?

+0

포스트는 당신이 자신을 알아 낸, 그리고 그것을 개선 할 수 있다면 우리는 당신을 알 수 있습니다. – alex

+0

@alex - 빠져 나가는 것이 훨씬 더 효율적인 방법이 있다면, 시간을 낭비하고 싶지 않습니다. 거기에 달콤한 대답이 없다면 매뉴얼에서 무언가를 복사 할 수 있습니다. – Ben

+0

내 솔루션이 편집되었습니다.이를 반영하도록 질문을 편집 할 수 있습니다. – alex

답변

5

원하는 것을 제공합니까? 당신이 like.this라는 이름의 폴더를 선택합니다하지 glob('*.*') 파일 수 있기 때문에

function readDir($path) { 

    // Make sure we have a trailing slash and asterix 
    $path = rtrim($path, '/') . '/*'; 

    $dirs = glob($path, GLOB_ONLYDIR); 

    $files = glob($path); 

    return array_unique(array_merge($dirs, $files)); 

} 

$path = '/path/to/dir/'; 

readDir($path); 

참고.

+0

('array_diff()'의 밑줄) 감사합니다. – Ben

+0

@alex - 네, 그건 꽤 우아한 해결책입니다. 당신은 어떻게 그것을 'usort'와 비교할까요? – Ben

+0

@Steve 파일 시스템이 원하는 순서대로 반환하면 훨씬 빠를 것입니다. 나는 실제로 어떤 정렬도하지 않습니다. 너에게 효과가 있었 니? ** 편집 ** 편집을했습니다. 그것이 당신을 위해 일하는 경우 알려주십시오 (내 테스트에서 저를 위해 일합니다). – alex

0

나는 파티에 늦었지만 glob()이 아닌 readdir()으로 해결책을 제시하고자합니다. 솔루션에서 누락 된 것은 재귀 버전의 솔루션입니다. 그러나 readdir을 사용하면 glob보다 빠릅니다.

그래서 글로브와 함께 그 결과는 다음과 같습니다

function myglobdir($path, $level = 0) { 
    $dirs = glob($path.'/*', GLOB_ONLYDIR); 
    $files = glob($path.'/*'); 
    $all2 = array_unique(array_merge($dirs, $files)); 
    $filter = array($path.'/Thumbs.db'); 
    $all = array_diff($all2,$filter); 

    foreach ($all as $target){ 
     echo "$target<br />"; 
     if(is_dir("$target")){ 
      myglobdir($target, ($level+1)); 
     } 
    } 
} 

그리고이 하나가 readdir 함께하지만, 기본적으로 같은 출력이 있습니다

function myreaddir($target, $level = 0){ 
    $ignore = array("cgi-bin", ".", "..", "Thumbs.db"); 
    $dirs = array(); 
    $files = array(); 

    if(is_dir($target)){ 
     if($dir = opendir($target)){ 
      while (($file = readdir($dir)) !== false){ 
       if(!in_array($file, $ignore)){ 
        if(is_dir("$target/$file")){ 
         array_push($dirs, "$target/$file"); 
        } 
        else{ 
         array_push($files, "$target/$file"); 
        } 

       } 
      } 

      //Sort 
      sort($dirs); 
      sort($files); 
      $all = array_unique(array_merge($dirs, $files)); 

      foreach ($all as $value){ 
       echo "$value<br />"; 
       if(is_dir($value)){ 
        myreaddir($value, ($level+1)); 
       } 
      } 
     } 
     closedir($dir); 
    } 

} 

나는 사람이 유용하게 찾을 수있는 희망을.

2

시도해보십시오. 간단한 기능은 PHP 위해 scandir에게 파일 및 폴더로 결과 (디렉토리)를 정렬하려면 :

function sort_dir_files($dir) 
{ 
     $sortedData = array(); 
     foreach(scandir($dir) as $file) 
     { 
       if(is_file($dir.'/'.$file)) 
         array_push($sortedData, $file); 
       else 
         array_unshift($sortedData, $file); 
     } 
     return $sortedData; 
}