2009-07-08 4 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; 

:)

ответ

14

Вместо использования readdir вы могли бы просто использовать scandir (documentation), который сортирует в алфавитном порядке по умолчанию.

Возвращаемое значение 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_SORT_DESCENDING' в качестве второго аргумента для' scandir (...) '. Несколько других констант сортировки были задокументированы также в предоставленной ссылке. –

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 Это делает каталог чтения хватку, как он возвращает массив, это легко сортируется:

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

Если вы используете Joomla1.5 вы должны использовать определенную постоянную JPATH_BASE вместо

$mainframe->getCfg('absolute_path') 

Если это расширение Joomla, что вы будете распространять, не используйте ScanDir() как это PHP5 только.

Лучшее, что нужно сделать, это использовать API Joomla. Он имеет классы для доступа к каталогам и файлам, которые накладываются друг на друга для разных сетей и протоколов. Таким образом, файловая система может быть, например, 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 :: файлы(), который фильтрует файлы, которые вы получаете.

Вы также не хотите использовать литералы URL, такие как/administrator /, поскольку их можно изменить. использовать методы JURI:

JURI :: base();

Если вы хотите, чтобы убедиться, что классы Joomla CSS в таблицах для:

'<tr class="row0">' 

использования:

'<tr class="row'.($i&1).'">' 

где $ я это число итераций.Это дает вам последовательность чередующихся 0s и 1s.

1

Если у нас есть встроенные функции PHP, всегда используйте его, они быстрее. используйте glob вместо перемещения папок, если он подходит для ваших нужд.

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

  • returs все в текущем каталоге, используйте Chdir() перед вызовом удалить GLOB_ONLYDIR включить файлы тоже (. будет только файлы) GLOB_MARK для добавления слэш в именах папок Удалить GLOB_NOSORT не сортировать массив
+1

Не всегда. Если у вас стандартизованный API, используйте это. В этом конкретном случае код был написан для Joomla CMS. Таким образом, он должен использовать API Joomla. Скорость редко вызывает беспокойство в веб-разработке. Хороший дизайн. – bucabay

Смежные вопросы