Php 如何按文件大小字符串对数组排序?

Php 如何按文件大小字符串对数组排序?,php,Php,我试图找出如何通过正确地设置字符串的文件大小来对数组进行排序。我正在构建一个如下所示的数组,并希望按照filesize列对其进行排序。我环顾四周,但没有找到任何对分类有太大帮助的东西 Array ( [0] => Array ( [0] => FileName [1] => 71.6 MB [2] => /path/to/file/ [3] => 2018-12-08 19:31:17 )

我试图找出如何通过正确地设置字符串的文件大小来对数组进行排序。我正在构建一个如下所示的数组,并希望按照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];
}

如何使用文件大小字符串对其进行正确排序?谢谢。

您需要使用php usort,请查看


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

为了使排序更容易,您应该在数组中存储由返回的数值,例如,将其添加到末尾,如下所示:

$file_array = Array(
    $fname,
    $fsize,
    $fpath,
    $f_tstamp,
    $size
);
那么,它应该简单到

usort($data_array, function($a, $b){ return $a[4] - $b[4]; });
的第二个参数在大多数语言中称为比较器函数。它一次接收两个数组项,并期望返回一个整数值:

  • 0
    表示保持元素当前的顺序
  • 负值意味着
    $a
    小于
    $b
    ,因此它应该在它之前
  • 正值意味着
    $a
    大于
    $b
    ,因此它应该在后面
每个参数的第四个索引是您的大小值,通过从第二个索引中减去第一个索引,您将得到一个升序排序顺序。您可以反转操作数(
$b[4]-$a[4]
)以获得降序排序顺序


如果您使用PHP7+,您也可以使用here来代替。

将实际文件大小存储为另一个数组元素中的字节是否更容易。也许,我还没有尝试过。我的意思是将
$size
作为say元素
[4]
是的,您可能是对的,但我现在已经从下面的答案开始工作了。感谢您的输入。使用当前方法会遇到的另一个问题是,当您四舍五入到2dp时,一个文件可能比另一个文件大45 MB,但是在GB中是一样的。所以如果我理解正确的话-你的说法是从
1.15GB
中减去
71.6MB
来按文件大小排序?@NigelRen OP包含一个解析器函数,他们用它来计算相应的字节数值:
$fsize=format\u size($size)实际上你是对的,它不是解析,而是转换成字符串。让我更新我的答案。@Richard请看更新后的答案,我第一次误解了你的
格式大小
功能,以前的版本会有问题。请支持@NigelRen指出问题,我最初认为,
format\u size
用于将第一个输出块中的字符串转换为数字。这个问题我读得不够透彻。