PHP:排序数组 - ftp文件列表?

时间:2010-07-15 04:52:11

标签: php sorting

我正在连接到ftp-server并显示列表中的所有项目。我希望按字母顺序排列该列表。

不应该这样做吗?

        // 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 个答案:

答案 0 :(得分:1)

你是对的,因为它似乎没有任何效果。

原因很简单:排序区分大小写。考虑到这一点,数组已经排序(小写字母在大写字母后面)。

如果您希望使用不区分大小写的排序,可以使用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
)

答案 1 :(得分:0)

首先,natcasesort将按“自然顺序”排序,不区分大小写。

要将文件夹排序到顶部,您需要询问FTP服务器是否有文件夹,然后将其放入单独的数组中,然后将两个数组合并在一起。似乎使用ftp_rawlist并解析结果将是最好的方法。

答案 2 :(得分:0)

您需要两个阵列。一个是目录,另一个是文件。然后对每个进行排序。

问题是,你没有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);
...