Упорядочивать array php kb, mb, gb

У меня есть array, который я наполняю консультацией. То, что я получаю, так это следующее:

array (size=9)
  '128 GB' => 
    array (size=1)
      0 => string '156' (length=3)
  '16 GB' => 
    array (size=2)
      0 => string '106' (length=3)
      1 => string '331' (length=3)
  '32 GB' => 
    array (size=2)
      0 => string '293' (length=3)
      1 => string '549' (length=3)
  '32 MB' => 
    array (size=2)
      0 => string '29' (length=2)
      1 => string '419' (length=3)
  '4 GB' => 
    array (size=2)
      0 => string '42' (length=2)
      1 => string '376' (length=3)
  '512 MB' => 
    array (size=1)
      0 => string '230' (length=3)
  '64 GB' => 
    array (size=1)
      0 => string '118' (length=3)
  '8 GB' => 
    array (size=2)
      0 => string '8' (length=1)
      1 => string '315' (length=3)
  '90 KB' => 
    array (size=1)
      0 => string '431' (length=3)

После я это печатаю в HTML в одних input checkbox:

<?php foreach ($memories as $name => $ram ): ?>
  <li value="<?= implode(',', $ram) ?>">
  <input type="checkbox" name="checkboxG5" id="id_<?= $name ?>"/>
<label for="id_<?=  $name ?>" class="css-label radGroup2">
 <?= $name ?>
</label>
</li>
<?php endforeach; ?>

Все функционирует хорошо, единственный недостаток состоит в том, что я хочу упорядочить для того, чтобы я не вытек 128gb, 16gb, 32gb... Я хочу смочь упорядочивать это из-за стоимости, вместо того, чтобы приказывать в алфавитном порядке, чтобы я был рукоположен из-за размера.

2
задан 09.11.2016, 23:03
4 ответа

Для того, чтобы изобретать колесо снова и снова?:)

В замечаниях, внесенный пользователями php.net - filesize () , есть две функции очень красивые:

Первой funciГіn filesize2bytes () , конвертирует tamaГ±o файла, читабельного людьми, в байт.

Пример: '10 MB' => 10000000

function filesize2bytes($str) { 

    $bytes = 0; 

    $bytes_array = array( 
        'B' => 1, 
        'KB' => 1024, 
        'MB' => 1024 * 1024, 
        'GB' => 1024 * 1024 * 1024, 
        'TB' => 1024 * 1024 * 1024 * 1024, 
        'PB' => 1024 * 1024 * 1024 * 1024 * 1024, 
    ); 

    $bytes = floatval($str); 

    if (preg_match('#([KMGTP]?B)$#si', $str, $matches) && !empty($bytes_array[$matches[1]])) { 
        $bytes *= $bytes_array[$matches[1]]; 
    } 

    $bytes = intval(round($bytes, 2)); 

    return $bytes; 
}

Второй funciГіn human_filesize () , конвертирует байт в tamaГ±o файла, читабельного людьми.

Пример: 10000000 => '10 MB'

function human_filesize($bytes, $decimals = 0) {

  $sz = 'BKMGTP';
  $factor = floor((strlen($bytes) - 1) / 3);

  return sprintf("%.{$decimals}f", $bytes / pow(1024, $factor)) .' '. @$sz[$factor].'B';
}

Сейчас только нуждаются в том, чтобы сочетать две функции и et voilГ!

$sortMemory = [];
$newMemory  = [];

foreach($memory as $bytes => $value) {

    // guardamos todo en el mismo orden pero con bytes
    $sortMemory[filesize2bytes($bytes)] = $value;
}

// ordenamos el array por la clave
ksort($sortMemory);

foreach($sortMemory as $readable_size => $value) {

    // y guardamos el array ordenado pero con el tamaño del archivo legible
    $newMemory[human_filesize($readable_size)] = $value;
}

И уже с tГє cГіdigo, (немножко измененный), у тебя есть твой список, упорядоченный: Последованные

<?php

foreach ($newMemory as $name => $ram ):

    // crea una id_90_KB sin espacio !
    $name_ID = 'id_'.str_replace(' ', '_', $name);
?>

<li value="<?php echo implode(',', $ram) ?>">
  <input type="checkbox" name="checkboxG5" id="<?php echo $name_ID; ?>"/>
  <label for="<?php echo  $name_ID; ?>" class="css-label radGroup2"><?php echo $name; ?></label>
</li>

<?php endforeach; ?>

:

<li value="431">
  <input type="checkbox" name="checkboxG5" id="id_90_KB"/>
  <label for="id_90_KB" class="css-label radGroup2">90 KB</label>
</li>    

<li value="29,419">
  <input type="checkbox" name="checkboxG5" id="id_32_MB"/>
  <label for="id_32_MB" class="css-label radGroup2">32 MB</label>
</li>    

<li value="230">
  <input type="checkbox" name="checkboxG5" id="id_512_MB"/>
  <label for="id_512_MB" class="css-label radGroup2">512 MB</label>
</li>    

<li value="42,376">
  <input type="checkbox" name="checkboxG5" id="id_4_GB"/>
  <label for="id_4_GB" class="css-label radGroup2">4 GB</label>
</li>    

<li value="8,315">
  <input type="checkbox" name="checkboxG5" id="id_8_GB"/>
  <label for="id_8_GB" class="css-label radGroup2">8 GB</label>
</li>    

<li value="106,331">
  <input type="checkbox" name="checkboxG5" id="id_16_GB"/>
  <label for="id_16_GB" class="css-label radGroup2">16 GB</label>
</li>    

<li value="293,549">
  <input type="checkbox" name="checkboxG5" id="id_32_GB"/>
  <label for="id_32_GB" class="css-label radGroup2">32 GB</label>
</li>    

<li value="118">
  <input type="checkbox" name="checkboxG5" id="id_64_GB"/>
  <label for="id_64_GB" class="css-label radGroup2">64 GB</label>
</li>    

<li value="156">
  <input type="checkbox" name="checkboxG5" id="id_128_GB"/>
  <label for="id_128_GB" class="css-label radGroup2">128 GB</label>
</li>

Видеть Demo

3
ответ дан 24.11.2019, 12:40
  • 1
    Большое спасибо... Также оно я функционирует... – cignius 10.11.2016, 02:03

Хотя PHP предлагает различные функции, чтобы упорядочивать используя ключи (ksort, krsort и uksort, ты можешь видеть полный список в documentaciГіn чиновник PHP ), ни одна из них не предлагает точно того, что ты ищешь, потому что он не позволяет тебе определять собственные ты funciГіn comparaciГіn, и тех, которые podrГ-an, ты функционировать, используют стоимость, и в каких-то случаях теряется ключ ( key ).

я боюсь, что он будет касаться тебя, делать что-то especГ-fico для твоего случая. Альтернатива serГ, - чтобы создавать array с ключами, когда этот array упорядочивать (с каким-либо из них mГ©todos родные PHP, как usort) и изменять немного cГіdigo despuГ©s.

AquГ - оставил одну тебе opciГіn, что он делает, состоит в том, что он преобразовывает стоимость в байт и тогда реализует ее comparaciГіn способа numГ©rica):

<?php

$memories = array(
    '128 GB' => array('156'),
    '16 GB' => array('106', '331'),
    '32 GB' => array('293','549'),
    '32 MB' => array('29', '419'),
    '4 GB' => array('42','376'),
    '512 MB' => array('230'),
    '64 GB' => array('118'),
    '8 GB' => array('8','315'),
    '90 KB' => array('431')
);

// creamos un array auxiliar que tendrá dos valores: la llave y el valor original
$memories2 = array();
foreach($memories as $name => $value) {
    $memories2[] = array($name, $value);
}

// función de comparación
function comparaSizes($a, $b) {

    // separamos el valor de la llave en arrays (0 => número; 1 => unidad)
    $arrA = explode(" ", $a[0]);
    $arrB = explode(" ", $b[0]);

    // calculamos el valor en Bytes para cada unidad
    switch ($arrA[1]) {
        case "GB": $arrA[0] = intval($arrA[0]) * 1000000000; break;
        case "MB": $arrA[0] = intval($arrA[0]) * 1000000; break;
        case "KB": $arrA[0] = intval($arrA[0]) * 1000; break;
        default: $arrA[0] = intval($arrA[0]);
    }

    // calculamos el valor en Bytes para cada unidad
    switch ($arrB[1]) {
        case "GB": $arrB[0] = intval($arrB[0]) * 1000000000; break;
        case "MB": $arrB[0] = intval($arrB[0]) * 1000000; break;
        case "KB": $arrB[0] = intval($arrB[0]) * 1000; break;
        default: $arrB[0] = intval($arrB[0]);
    }

    // devolvemos la comparación de los valores en Bytes
    return ($arrA[0] < $arrB[0]) ? -1 : 1;
}

// ordenas el array auxiliar usando la función de comparación que acabas de crear
usort($memories2, "comparaSizes");

// tu mismo código adaptándolo un poco
foreach ($memories2 as $name => $ram ): ?>
  <li value="<?= implode(',', $ram[1]) ?>">
  <input type="checkbox" name="checkboxG5" id="id_<?= $ram[0] ?>"/>
<label for="id_<?=  $ram[0] ?>" class="css-label radGroup2">
 <?= $ram[0] ?>
</label>
</li>
<?php endforeach; ?>

Cuanod я выполняю этот cГіdigo, результат остается что-то как это:

[ ] 90 KB
[ ] 32 MB
[ ] 512 MB
[ ] 4 GB
[ ] 8 GB
[ ] 16 GB
[ ] 32 GB
[ ] 64 GB
[ ] 128 GB
1
ответ дан 24.11.2019, 12:40
  • 1
    Большое спасибо, тестируя какие-то решения и сравнивая documentaci и # 243; n у меня остается ясным, как использование в этом случае Keys array, чтобы использовать одну или другой funci и # 243; n. Спасибо. – cignius 10.11.2016, 02:07

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

$memories=array(
    "32 GB"=>["293","456"],
    "128 GB"=>["500","600"],
    "4 GB"=>["800","700"]
);
var_dump($memories);
uksort($memories,'strnatcasecmp');
var_dump($memories);

результат introducir la descripción de la imagen aquí

0
ответ дан 24.11.2019, 12:40
  • 1
    Вещь est и # 225; в котором array tambi и # 233; n смоги иметь KB и МБ, не единственно Великобритания. – Francisco Romero 09.11.2016, 23:43
  • 2
    Soluci и # 243; n изобретательная, но оно не функционирует, если есть различные единицы. Quiz и # 225; s было возможно меняться каким-то образом " sencilla" чтобы это решать. – Alvaro Montoro♦ 09.11.2016, 23:44
  • 3
    Ummm Eso si - проблема xD – Aquiles Perez 10.11.2016, 01:29
  • 4
    Спасибо, этот пример ясный, когда он относится друг к другу, и #250; nicamente номенклатуры... из-за эксперта и # 237; говорить это. – cignius 10.11.2016, 02:08

Он был бы лучше, если pudises перемещать консультацию sql, который ты используешь, и видеть, оттуда можешь ли ты получать данные в команде используя ORDER BY.

Например, ты можешь размещать ORDER BY ram ASC

Рам как пример, ты это заменяешь по имени поля, откуда ты получаешь эту стоимость (128gb, и т.д.).

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

Ты комментируешь как!

0
ответ дан 24.11.2019, 12:40