对数组中的混合数据进行排序

时间:2017-08-21 16:01:41

标签: php

如何按升序对某些数据进行排序?

我已经使用了几个产品来抓住这个(应该注意这些可以改为任何数字),这是未分类的数据:

  • 10毫克
  • 100mg
  • 500mg
  • 1克
  • 30mg
  • 300mg
  • 1.5克
  • 3克

这是我尝试过但它没有输出任何东西:

<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等

2 个答案:

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

有点复杂但它也会做公斤! :-S

<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>