这种或那种方式,你需要将这些值转换成以t表示的数字他是相同的度量单位,以便您可以对它们进行比较。我可以想到两种方法:
- 遍历数组并将所有值转换为此度量单位,然后对新数组进行排序。
- 使用自定义比较函数对原始数组进行排序,在比较它们之前转换这些值。
第一种方法会更有效率,因为您只需在数组中执行一次转换操作,而在第二种方法中,您每次比较数字时都会执行这些转换,这几乎肯定会更多昂贵。如果可以复制或修改数组,则应该使用第一种方法。
在任何情况下,将这些值转换成一个简单的号码的功能将类似于以下内容:
$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');
基于“MB”值将字符串部分转换为数字(如'1 MB' ='1','1 GB' ='1000'),因为它是最小的类型,因此使用数组排序函数,然后再转回来?这就是我在这么晚的时候能想到的唯一的事情...... – Rasclatt 2015-04-06 08:09:51