如何按文件大小字符串对数组进行排序



我正试图弄清楚如何正确地按文件大小字符串对数组进行排序。我正在构建一个如下所示的数组,并希望按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返回的数值存储在数组中,例如将其添加到末尾,如下所示:

$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](以获得降序排序。

如果你使用PHP7+,你也可以在这里使用太空船操作员。

您需要使用php-usort,看看php.net usort

它采用比较器函数作为第二参数

最新更新