按数组的值升序对数组进行排序。较低的值先出现,然后是较高的值



我正在寻找一个基于值排序数组的解决方案。最小值会先出现,然后是更高的值。

数值如下("某些值需要英寸间距):

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"' );

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

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

相关内容

最新更新