【问题标题】:Sort Array in Ascending order by it's value. Lower value come first and then Higher values按其值升序对数组进行排序。先低价值后高价值
【发布时间】:2021-10-18 09:29:05
【问题描述】:

我正在寻找一种基于值对数组进行排序的解决方案。首先是最小值,然后是更高的值。

数值如下(“有些数值需要英寸唱):

array( '1/3', '1/4', '1', '4"', '18 11/12"', '18 1/4"', '2-3/8', '3-3/9' )

我为此创建的代码是

$array=array( '1/3', '1/4', '1','4"', '18 11/12"', '18 1/4"', '2-3/8', '3-3/9');

foreach( $array as $k=>$v )
{
    $copy[$k] = preg_match("/(\d+)\/(\d+)/",$v,$m)?$m[1]/$m[2]+(int)$v:(int)$v;
}

array_multisort( $copy, SORT_NUMERIC, $array );

print_r( $array );

预期结果

array( '1/4', '1/3', '1', '2-3/8', '3-3/9', '4"', '18 1/4"', '18 11/12"' );

【问题讨论】:

  • 首先,您需要一个解析器来计算像 18 1/4 " 这样的表达式。从您的示例中不清楚该解析器必须做什么。
  • 那么,18 11/12 是混合分数吗?

标签: php arrays sorting


【解决方案1】:

我更新的代码如下,它给了我想要的输出。如果您想要这种排序,希望这会对您有所帮助。

function fractionToDecimal( $fraction ) 
{
    preg_match('/^(?P<whole>\d+)?\s?((?P<numerator>\d+)\/(?P<denominator>\d+))?$/', $fraction, $components);

    $whole = $components['whole'] ?: 0;
    $numerator = $components['numerator'] ?: 0;
    $denominator = $components['denominator'] ?: 0;

    $decimal = $whole;
    $numerator && $denominator && $decimal += ($numerator/$denominator);

    return $decimal;
}

$copy  = array();
$array = array('1/3','1/4','1','4"','18 11/12"','18 1/4"','2-3/8','3-3/9');

foreach( $array as $k => $v )
{
    $midval = round(fractionToDecimal($v),2);

    if( $midval == 0 )
    {
        $copy[$k] = preg_match("/(\d+)\/(\d+)/",$v,$m)?$m[1]/$m[2]+(int)$v:(int)$v;
    }
    else
    {
        $copy[$k] = $midval;
    }
}
array_multisort( $copy, $array );
print_r( $array );

【讨论】:

    猜你喜欢
    • 2013-08-15
    • 1970-01-01
    • 2013-08-16
    • 2023-03-28
    • 1970-01-01
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多