сортировка — PHP: сортировка массива байтов

Ищем возможный способ сортировки этого следующего массива. принимая байты в качестве жала при рассмотрении.

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

Решение

Вы можете отсортировать этот массив, используя пользовательскую функцию сравнения, преобразовав строку в значение байта.

$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);
3

Другие решения

можешь попробовать нацорт

https://php.net/manual/en/function.natsort.php

<?php
$array = array('10t', '2t', '3t');
natsort($array);

echo '<pre>';
print_r($array);
echo '</pre>';
?>

// выход
массив (
2t,
ю,
10т
)

0

Так или иначе, вам нужно преобразовать эти значения в некоторые числа, выраженные в одной и той же единице измерения, чтобы вы могли их сравнить. Я могу придумать два способа сделать это:

  1. Пройдите по массиву и преобразуйте все значения в эту единицу измерения, затем отсортируйте новый массив.
  2. Сортируйте исходный массив, используя пользовательскую функцию сравнения, которая преобразует значения перед их сравнением.

Первый метод будет более эффективным, потому что вы будете проходить массив только один раз для выполнения преобразований, тогда как во втором методе вы будете выполнять эти преобразования каждый раз, когда сравниваете числа, что почти наверняка дороже. Если есть возможность скопировать или изменить массив, вам следует использовать первый метод.

В любом случае, функция для преобразования значений в простое число будет выглядеть примерно так:

$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');
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];
}
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector