2009-07-08 7 views
5

얼마나 간단 할 지 모르겠지만 특정 폴더의 파일을 표시하는 스크립트를 사용하고 있습니다. 알파벳순으로 표시하고 싶습니다. 이렇게하는 것이 어려울까요?PHP (폴더) 파일 알파벳 순서로 나열 하시겠습니까?

if ($handle = opendir($mainframe->getCfg('absolute_path') ."/images/store/")) { 
     while (false !== ($file = readdir($handle))) { 
      if ($file != "." && $file != "..") { 
       if (($file != "index.html")&&($file != "index.php")&&($file != "Thumbs.db")) { 
       $strExt = end(explode(".", $file)); 
        if ($strExt == 'jpg') { 
         $Link = 'index.php?option=com_shop&task=deleteFile&file[]='.$file; 
         $thelist .= '<tr class="row0"><td nowrap="nowrap"><a href="'.$Link.'">'.$file.'</a></td>'."\n"; 
         $thelist .= '<td align="center" class="order"><a href="'.$Link.'" title="delete"><img src="/administrator/images/publish_x.png" width="16" height="16" alt="delete"></a></td></tr>'."\n"; 
        } 

       } 
      } 
     } 
     closedir($handle); 
    } 
    echo $thelist; 

: 대신 단순히 scandir (documentation)를 사용할 수 readdir를 사용

답변

14

기본적으로 알파벳 순으로 정렬 : 여기에 내가 사용하고 코드입니다.

scandir의 반환 값은 문자열이 아닌 배열이므로 코드를 약간 조정하여 최종 null 반환 값을 확인하는 대신 배열을 반복 처리해야합니다. 또한, scandir 디렉토리 경로를 대신 입력으로 파일 핸들을 가진 문자열을 사용, 새 버전은 다음과 같이 보일 것입니다 :

foreach(scandir($mainframe->getCfg('absolute_path') ."/images/store/") as $file) { 
    // rest of the loop could remain unchanged 
} 
+0

아, 그게 매력처럼 끝내 주셔서 고마워요. D – SoulieBaby

+0

동일한 정확한 문제를 해결하는 동안이 대답을 찾았습니다. 감사! 적은 비용으로 잘 작동했습니다! – Agos

+0

위대한 작품. 문서를 읽은 후에는'scandir (...) '의 두 번째 인수로'SCANDIR_SORT_DESCENDING'을 사용하여 정렬 순서를 바꿀 수도있었습니다. 제공되는 링크에는 몇 가지 다른 정렬 상수도 문서화되어 있습니다. –

3

그 코드가 꽤 지저분한 보인다. 프리젠 테이션을 사용하여 디렉토리 탐색 논리를 분리 할 수 ​​있습니다. (내 생각에) 훨씬 더 간결 버전 :

<?php 

// Head of page 
$it = new DirectoryIterator($mainframe->getCfg('absolute_path') . '/images/store/')); 

foreach ($it as $file) { 
    if (preg_match('#\.jpe?g$#', $file->getFilename())) 
     $files[] = $file->getFilename(); 
} 
sort($files); 

// Further down 
foreach ($files as $file) 
    // display links to delete file. 
?> 

당신은 열거 나 핸들을 닫는에 대해 걱정할 필요가 없습니다, 당신은 정규 표현식으로 파일 이름을 확인하고 있기 때문에, 당신은하지 않습니다 분해 또는 조건부 검사가 필요합니다.

+1

감사합니다. – SoulieBaby

2

내가 좋아하는 Glob 그것은 쉽게 정렬의 배열 반환으로 디렉토리가 스냅을 읽을 수 있습니다 : 당신이 대신 정의 된 상수 JPATH_BASE를 사용한다 Joomla1.5을 사용하는 경우

<?php 
$files = glob("*.txt"); 
sort($files); 
foreach ($files as $filename) { 
    echo "$filename size " . filesize($filename) . "\n"; 
} 
?> 
1

$mainframe->getCfg('absolute_path') 

이는 PHP5는 당신이)를 배포합니다 위해 scandir를 (사용하지 않는 Joomla를 확장하는 경우 만.

가장 좋은 방법은 Joomla API를 사용하는 것입니다. 다른 네트워크 및 프로토콜을 통해 계층화 된 디렉토리 및 파일 액세스 클래스를 제공합니다. 따라서 파일 시스템은 예를 들어 FTP를 통해 수행 될 수 있으며 클래스는 모든 네트워크/프로토콜에 대해 확장 될 수 있습니다.

jimport('joomla.filesystem.folder'); 
$files = JFolder::files(JPATH_BASE."/images/store/"); 
sort($files); 
foreach($files as $file) { 
    // do your filtering and other task 
} 

는 또한 JFolder에 두 번째 매개 변수로 정규 표현식을 전달할 수 있습니다 :: 파일을() 귀하가받는 파일을 필터링하는.

/administrator /와 같은 URL 리터럴도 변경할 수 있으므로 사용하지 않으려합니다. 다음과 같은 JURI 메소드를 사용하십시오.

JURI :: base();

당신을 위해, 표에 줌라 CSS 클래스 있는지 확인하려면 :

'<tr class="row0">' 

사용 :

은 $ 내가은 반복 횟수가
'<tr class="row'.($i&1).'">' 

.이것은 당신에게 0과 1의 교대 시퀀스를 제공합니다.

1

PHP가 내장 된 함수가있는 경우 항상 사용하십시오. 빠릅니다. 필요에 따라 폴더를 탐색하는 대신 glob을 사용하십시오.

$ folder_names = array(); $ folder_names = glob ('*', GLOB_ONLYDIR + GLOB_MARK + GLOB_NOSORT);

  • 도 파일을 포함하도록 GLOB_ONLYDIR를 제거 를 호출하기 전에 현재 디렉토리를 사용 CHDIR()에있는 모든 returs (. 파일 만 것) GLOB_MARK 폴더 이름에 제거 GLOB_NOSORT을 슬래시를 추가하는 것입니다 배열을 정렬하지 않으려면
+1

항상 그렇지는 않습니다. 표준화 된 API를 사용하는 경우이를 사용하십시오. 이 특별한 경우 코드는 Joomla CMS 용으로 작성되었습니다. 따라서 Joomla API를 사용해야합니다. 속도는 웹 개발에서 거의 문제가되지 않습니다. 좋은 디자인입니다. – bucabay

관련 문제