寻找对此后续数组进行排序的可能方法。将字节作为考虑因素。
Array
(
[0] => 100 MB
[4] => 10 MB
[8] => 1GB
[12] => 20 MB
[16] => 250 MB
[20] => 2GB
[24] => 4 MB
[28] => 500 MB
[32] => 50 MB
[36] => 5GB
[40] => 8GB
[44] => 0 MB
)
答案 0 :(得分:3)
您可以使用自定义比较函数对此数组进行排序,方法是将字符串转换为byte的值。
$arr = array(
0 => "100 MB",
4 => "10 MB",
8 => "1GB",
12 => "20 MB",
16 => "250 MB",
20 => "2GB",
24 => "4 MB",
28 => "500 MB",
32 => "50 MB",
36 => "5GB",
40 => "8GB",
44 => "0 MB"
);
function toByte($value) {
$multiple = (stripos($value, "K") > 0) ? 1024 : 1;
$multiple *= (stripos($value, "M") > 0) ? 1048576 : 1;
$multiple *= (stripos($value, "G") > 0) ? 1073741824 : 1;
return floatval($value) * $multiple;
}
usort($arr, function($v1, $v2) {
return toByte($v1) - toByte($v2);
});
var_dump($arr);
答案 1 :(得分:0)
你可以试试natsort
https://php.net/manual/en/function.natsort.php
<?php
$array = array('10t', '2t', '3t');
natsort($array);
echo '<pre>';
print_r($array);
echo '</pre>';
?>
//输出 阵列( 2T, 3T, 10吨 )
答案 2 :(得分:0)
无论如何,您需要将这些值转换为以相同测量单位表示的某些数字,以便您可以对它们进行比较。我可以想到两种方法:
第一种方法会更有效率,因为您只需要遍历数组一次即可执行转换,而在第二种方法中,每次比较数字时都会进行这些转换,这几乎肯定会更贵。如果可以复制或修改数组,则应使用第一种方法。
在任何情况下,将值转换为简单数字的函数如下所示:
$unitMultipliers = array(
'b' => 1,
'kb' => 1024,
'mb' => 1048576,
'gb' => 1073741824,
);
function toBytes($stringValue) {
if (!preg_match('^/([0-9]+)\s*([a-z]+)$/i', $matches)) {
// If for some reason we can't find the pattern, exit early
return 0;
}
$bytes = (int) $matches[1];
$unit = strtolower($matches[2]);
return $bytes * $unitMultipliers[$unit];
}
要实现解决方案1并转换数组,请使用:
$newArray = array_map('toBytes', $originalArray);
$sortedArray = sort($newArray);
要实施解决方案2并使用自定义比较,请使用:
function compare($a, $b) {
$aBytes = toBytes($a);
$bBytes = toBytes($b);
if ($aBytes === $bBytes) {
return 0;
}
return $aBytes > $bBytes ? 1 : -1;
}
$sortedArray = usort($originalArray, 'compare');
答案 3 :(得分:0)
试试这个:
$inpArr = array(0 => '100 MB', 4=>'10 MB', 8=>'1GB', 12=>'20 MB', 16=>'250 MB', 20=>'2GB', 24=>'4 MB', 28=>'500 MB', 32=>'50 MB', 36=>'5GB', 40=>'8GB', 44=>'0 MB');
$tempArr = array();
$sortArr = array();
foreach ($inpArr AS $key => $elem) {
$unit = trim(substr($elem, -2));
if ($unit == 'GB') {
$tempArr[$key] = intval(trim(strstr($elem, 'GB', true))) * 1024;
} else {
$tempArr[$key] = intval(trim(strstr($elem, 'MB', true)));
}
asort($tempArr);
}
foreach ($tempArr AS $key => $elem) {
$sortArr[] = $inpArr[$key];
}