我正在寻找一种基于值对数组进行排序的解决方案。最小值将分别出现在最小值和较高值之前。
取值如下(“某些取值需要英寸sing ):
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"' );
发布于 2021-08-16 12:06:42
我更新的代码如下,它给出了我想要的输出。如果你想要这种排序方式,希望这篇文章能对你有所帮助。
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 );
https://stackoverflow.com/questions/68800968
复制相似问题