如何按升序对某些数据进行排序?
我已经使用了几个产品来抓住这个(应该注意这些可以改为任何数字),这是未分类的数据:
这是我尝试过但它没有输出任何东西:
<select>
<?php $uniquePids = array_unique($results);
$results = sort($uniquePids);
foreach ( $results as $result ) { ?>
<option value="<?php echo $result; ?>"><?php echo $result; ?></option>
<?php } ?>
</select>
如何将其分类为10mg,30mg,100mg等
答案 0 :(得分:3)
我认为这是最美丽的解决方案:标准化为最小单位,计算转换因子,并按键排序。
<?php
$a = [
'10mg',
'100mg',
'500mg',
'1 gram',
'30mg',
'300mg',
'1.5 gram',
'3 gram',
];
$r = [];
foreach ($a as $v) {
if (strpos($v, 'mg') !== false) {$k = 1;} // 1 mg
if (strpos($v, 'gram') !== false) {$k = 1000;} // 1 gram = 1000 mg
$r[floatval($v)*$k] = $v;
}
ksort($r);
var_dump($r);
?>
array(8) {
[10]=>
string(4) "10mg"
[30]=>
string(4) "30mg"
[100]=>
string(5) "100mg"
[300]=>
string(5) "300mg"
[500]=>
string(5) "500mg"
[1000]=>
string(6) "1 gram"
[1500]=>
string(8) "1.5 gram"
[3000]=>
string(6) "3 gram"
}
答案 1 :(得分:0)
<select>
<?php
/**
* convert string weight to milligrams
*
* @param string $value
* @return float|int|false
*/
function strToMg($value)
{
$result = false;
if (preg_match('/^([0-9.]+)[ ]*g(ram)?s?$/', $value, $arrMatches)) {
$result = $arrMatches[1] * 1000;
} elseif (preg_match('/^([0-9.]+)[ ]*m(illi)?g(ram)?s?$/', $value, $arrMatches)) {
$result = $arrMatches[1];
} elseif (preg_match('/^([0-9.]+)[ ]*k(ilo)?g(ram)?s?$/', $value, $arrMatches)) {
$result = $arrMatches[1] * 10000000;
}
return $result;
}
/**
* compare 2 string weights
*
* @param string $a
* @param string $b
* @return int
*/
function cmp($a, $b)
{
$aMg = strToMg($a);
$bMg = strToMg($b);
if ($aMg > $bMg) {
$result = 1;
} elseif ($aMg < $bMg) {
$result = -1;
} else {
$result = 0;
}
return $result;
}
usort($results, 'cmp');
foreach ($results as $result) { ?>
<option value="<?php echo $result; ?>"><?php echo $result; ?></option>
<?php } ?>
</select>