首页 文章

如何通过filesize字符串对数组进行排序?

提问于
浏览
0

我试图弄清楚如何正确地通过filesize字符串对数组进行排序 . 我正在构建一个如下所示的数组,并希望通过filesize列对其进行排序 . 我环顾四周但却找不到任何有助于排序的东西 .

Array (
    [0] => Array (
        [0] => FileName 
        [1] => 71.6 MB 
        [2] => /path/to/file/
        [3] => 2018-12-08 19:31:17 ) 
    [1] => Array ( 
        [0] => FileName
        [1] => 1.15 GB 
        [2] => /path/to/file/
        [3] => 2018-12-08 17:36:28 ) 
    [2] => Array ( 
        [0] => FileName
        [1] => 10.22 MB 
        [2] => /path/to/file/
        [3] => 2018-12-08 16:13:24 ) 
    [3] => Array ( 
        [0] => FileName
        [1] => 34.42 MB 
        [2] => /path/to/file/
        [3] => 2018-12-08 16:24:27 ) 
    [4] => Array ( 
        [0] => FileName
        [1] => 466.18 KB 
        [2] => /path/to/file/
        [3] => 2018-12-08 16:31:44 ) 
    [5] => Array ( 
        [0] => FileName
        [1] => 26.98 MB 
        [2] => /path/to/file/
        [3] => 2018-12-08 17:34:57 )
    )

我正在从数据库加载数据,并在使用此函数构建数组时获取并添加文件大小 .

function format_size($size) {
    $sizes = array(" Bytes", " KB", " MB", " GB", " TB", " PB", " EB", " ZB", " YB");
    if ($size == 0) { return('n/a'); } else {
    return (round($size/pow(1024, ($i = floor(log($size, 1024)))), 2) . $sizes[$i]); }
}

这基本上就是我构建数组的方式 .

if ($stmt->rowCount() > 0) {
    $stmt->setFetchMode(PDO::FETCH_ASSOC);
    $iterator = new IteratorIterator($stmt);
    $data_array = Array();
    foreach ($iterator as $key => $row) {
        $fname = $row["filename"];
        $size = filesize('/path/to/file/' . $row["filename"]);
        $fsize = format_size($size);
        $fpath = '/path/to/file/' . $row["filename"];
        $f_tstamp = $row['timestamp'];

        $file_array = Array(
            $fname,
            $fsize,
            $fpath,
            $f_tstamp
            );

        $time[$key] = $row['timestamp'];
        $data_array[] = $file_array;
   }

这是我按时间戳排序的方式 .

array_multisort($time, SORT_DESC, $data_array);
foreach ($data_array as $val) {
    print $val[0];
    print $val[1];
    print $val[2];
    print $val[3];
}

如何使用filesize字符串对其进行正确排序?谢谢 .

2 回答

  • 1

    为了使排序更容易,您应该将filesize返回的数值存储在数组中,例如通过将它添加到最后,如下所示:

    $file_array = Array(
        $fname,
        $fsize,
        $fpath,
        $f_tstamp,
        $size
    );
    

    然后,它应该如此简单

    usort($data_array, function($a, $b){ return $a[4] - $b[4]; });
    

    usort的第二个参数是大多数语言中的比较器函数 . 它一次接收两个数组项,并期望一个整数返回值:

    • 0 表示按元素当前的顺序保留元素

    • 负值意味着 $a 小于 $b ,所以它应该在它之前

    • 正值意味着 $a 大于 $b ,所以它应该在它之后

    每个参数的第四个索引是您的大小值,通过从第二个中减去第一个,您将获得升序排序 . 您可以反转操作数( $b[4] - $a[4] )以获得降序排序 .

    如果你使用PHP 7,你也可以在这里使用spaceship operator .

  • -1

    你需要使用php usort,看看php.net usort

    它将比较器函数作为第二个参数

相关问题