Why invent the wheel again and again? :)
In the notes contributed by the users of php.net - filesize () , there is two very nice features:
The first feature is filesize2bytes () , converts the file size, human-readable , in bytes.
Example: '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;
}
The second function is human_filesize () , converts bytes to file size, readable by humans.
Example: 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';
}
Now you only need to combine the two functions and 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;
}
And already with your code, (little modified), you have your list sorted:
<?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; ?>
Result:
<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>
View Demo