PHP: сортировка массива - список файлов ftp? - PullRequest
2 голосов
/ 15 июля 2010

Я подключаюсь к ftp-серверу и отображаю все элементы в списке.я хочу, чтобы этот список был упорядочен по алфавиту.

разве это не должно это делать?

        // get contents of the current directory
    $contents = ftp_nlist($conn_id, $path);
    sort($contents);

это часть сценария!

// get contents of the current directory
$contents = ftp_nlist($conn_id, $path);
sort($contents);
print "<ul class='server_list'>";
foreach ($contents as $value) {
    $line = str_replace($path, "", $value);
    $ext = pathinfo($line, PATHINFO_EXTENSION);
    if (strlen($ext) > 0) { //File
        print "<li class='file'>";
        print "<a href='d.php/?p=". $path . $line."'>$line</a>";
        print "</li>";
    } else { //Folder
        print "<li class='folder'>";
        print "<a href='?p=". $path . $line."'>$line</a>";
        print "</li>";
    }
}
print "</ul>";

более того я 'Мне бы хотелось, чтобы все папки были вверху.поэтому все папки должны быть упорядочены в алфавитном порядке, а затем все файлы должны быть перечислены в abc ...

print_r($contents), прежде чем сортировка даст мне:

Array ( 
    [0] => /userupload/OrderNo_100750_HT 
    [1] => /userupload/README.txt 
    [2] => /userupload/anotherfolder 
    [3] => /userupload/avatar.jpg 
    [4] => /userupload/subfolder1 
) 

Ответы [ 3 ]

1 голос
/ 15 июля 2010

Вы правы, по какой-то причине это никак не влияет.

Причина проста: Сортировка чувствительна к регистру . И учитывая это, массив уже отсортирован (строчные буквы идут после заглавных букв).

Если вы хотите иметь сортировку без учета регистра, вы можете использовать natcasesort():

natcasesort($contents);
print_r($contents);

дает

Array
(
    [2] => /userupload/anotherfolder
    [3] => /userupload/avatar.jpg
    [0] => /userupload/OrderNo_100750_HT
    [1] => /userupload/README.txt
    [4] => /userupload/subfolder1
)
0 голосов
/ 15 июля 2010

Вам понадобятся два массива. Один с каталогами и один с файлами. Затем сортируйте каждый.

Проблема в том, что в PHP нет функции для проверки того, является ли файл каталогом или файлом.

Вот обходной путь, который можно найти на php.net:

function ftp_is_dir($dir, $ftpcon) {
    // get current directory
    $original_directory = ftp_pwd( $ftpcon );
    // test if you can change directory to $dir
    // suppress errors in case $dir is not a file or not a directory
    if ( @ftp_chdir( $ftpcon, $dir ) ) {
        // If it is a directory, then change the directory back to the original directory
        ftp_chdir( $ftpcon, $original_directory );
        return true;
    } 
    else {
        return false;
    }        
} 

С этим вы можете сделать:

// get contents of the current directory
$contents = ftp_nlist($conn_id, $path);
$dirs = array();
$files = array();
foreach ($contents as $value) {
  if (ftp_is_dir($value, $conn_id)) $dirs[] = $value;
  else $files[] = value;
}
$contents = array();
sort($dirs);
sort($files);
$contents = array_merge ($dirs, $files);
...
0 голосов
/ 15 июля 2010

Для начала natcasesort будет сортироваться в «естественном порядке» без учета регистра.

Для сортировки папок по верху вам нужно будет спросить FTP-сервер, является ли что-то папкой, затем поместить ее в отдельный массив и объединить оба массива вместе. Казалось бы, использование ftp_rawlist и анализ результата будет лучшим способом сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...