PHP:对字节数组进行排序

时间:2015-04-06 08:02:30

标签: php sorting byte

寻找对此后续数组进行排序的可能方法。将字节作为考虑因素。

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
)

4 个答案:

答案 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)

无论如何,您需要将这些值转换为以相同测量单位表示的某些数字,以便您可以对它们进行比较。我可以想到两种方法:

  1. 遍历数组并将所有值转换为此测量单位,然后对新数组进行排序。
  2. 使用自定义比较函数对原始数组进行排序,该函数在比较之前转换值。
  3. 第一种方法会更有效率,因为您只需要遍历数组一次即可执行转换,而在第二种方法中,每次比较数字时都会进行这些转换,这几乎肯定会更贵。如果可以复制或修改数组,则应使用第一种方法。

    在任何情况下,将值转换为简单数字的函数如下所示:

    $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];
}