2014-11-16 9 views
1

디렉토리의 내용을 오름차순 (알파벳 순)으로 정렬해야합니다. 디렉터리 이름이 파일 이름 뒤에 (알파벳순으로) 표시 되더라도 디렉터리는 파일 앞에 와야합니다. 파일 탐색기와 같은 방식으로, 디렉토리를 정렬 한 다음 정렬 된 파일을 나열합니다. 이 같은일반 파일보다 먼저 디렉토리에있는 하위 디렉토리로 사전 순으로 디렉토리 내용을 정렬 하시겠습니까?

if($handler = opendir($dir)) 
{ 
    while (($sub = readdir($handler)) !== FALSE) 
    { 
     // ... 
    }  
    closedir($handler); 
} 

답변

2

(PHP 자동 정렬 제 다음 두 번째 요소로하여 예정) 마지막으로 상기 제거 즉 [is_file(path), path] 같은 쌍으로 배열, 정렬이 배열을 채우는 것이 달성하는 직접적인 방법 is_file 비트 :

$path = 'somedir'; 
$dir = []; 

// populate 
foreach(glob("$path/*") as $f) 
    $dir []= [is_file($f), $f]; 

// sort 
sort($dir); 

// remove 
$dir = array_map('end', $dir); 

// PROFIT 
print_r($dir); 
+0

멋진데, 나는 스케일러 어레이가 아닌 값에 대해 '정렬'을 잘하지 못했습니다. – robbmj

0

뭔가

$contents = array(); 
while (($sub = readdir($handler)) !== FALSE) { 
    if ($sub !== '.' && $sub !== '..') { 
     $contents[] = array('is_dir' => is_dir($sub), 'name' => $sub); 
    }  
} 

closedir($handler); 

usort($contents, function($a, $b) { 
    if ($a['is_dir'] && !$b['is_dir']) { 
     return -1; 
    } 
    else if (!$a['is_dir'] && $b['is_dir']) { 
     return 1; 
    } 
    // they are either both files or both directories 
    else { 
     return strcmp($a['name'], $b['name']); 
    } 
}); 

foreach ($contents as $c) { 
    echo $c['name'] . PHP_EOL; 
} 

은 다음 디렉토리에 테스트 작동합니다 :

I는 알파벳 순으로 나에게 정렬 된 목록을 제공하는 다음 코드를 사용하고 있지만, 먼저 디렉토리를 진행하지 않습니다 (디렉토리에 확장자가 없음) :

ls 
1 findp.php fooo simple_html_dom.php test test.txt 

출력 :

1 
fooo 
test 
findp.php 
simple_html_dom.php 
test.txt