PHP如何对包含分数的复杂字符串数组进行升序排序?
如何对包含分数的PHP数组按
x分隔的数值升序排序? 嘿,作为PHP新手碰到这种带分数的排序需求确实容易懵——PHP确实没有专门处理这种格式的内置排序函数,但咱们可以用usort()配合自定义逻辑轻松解决!
首先,咱们得明确核心需求:每个数组元素是用x分隔的三个部分,其中可能包含分数(比如1/4),需要按这三个部分的实际数值依次升序排序,而不是按字符串的字典顺序(不然1会错误地排在1/4前面)。
解决步骤
- 先写一个辅助函数,把分数字符串转换成浮点数,这样才能正确比较数值大小:
function fractionToFloat($fraction) { // 判断是否是分数格式 if (strpos($fraction, '/') !== false) { list($numerator, $denominator) = explode('/', $fraction); return (float)$numerator / (float)$denominator; } // 如果是整数,直接转成浮点数 return (float)$fraction; }
- 用
usort()函数,传入自定义的比较逻辑:
$values = array( "1/4x1/4x1", "1/2x1/2x1", "3/4x3/4x1", "1/4x1/4x2", "1/2x1/2x2", "3/4x3/4x2", "1x1x1", "1x2x1", "2x1x1" ); usort($values, function($a, $b) { // 把两个元素按x分割成三个部分 $partsA = explode('x', $a); $partsB = explode('x', $b); // 依次比较三个部分的数值 for ($i = 0; $i < 3; $i++) { $valA = fractionToFloat($partsA[$i]); $valB = fractionToFloat($partsB[$i]); // 如果当前部分数值不同,直接返回比较结果 if ($valA !== $valB) { return $valA < $valB ? -1 : 1; } } // 三个部分都相同,返回0表示相等 return 0; }); // 打印排序后的数组 print_r($values);
代码解释
usort()是PHP的自定义排序函数,它会遍历数组,用我们传入的匿名函数两两比较元素,最终完成排序。- 辅助函数
fractionToFloat()的作用是把1/4转换成0.25,3/4转换成0.75,这样就能避免字符串排序的坑(比如字符串"1"会比"1/4"靠前,但实际数值1比0.25大)。 - 比较逻辑完全贴合你的需求:先比第一个
x前的数值,相同就比第二个,再相同比第三个,确保排序结果和你想要的目标数组一致。
运行这段代码后,你会得到完全符合预期的排序结果:
Array ( [0] => 1/4x1/4x1 [1] => 1/4x1/4x2 [2] => 1/2x1/2x1 [3] => 1/2x1/2x2 [4] => 3/4x3/4x1 [5] => 3/4x3/4x2 [6] => 1x1x1 [7] => 1x2x1 [8] => 2x1x1 )
内容的提问来源于stack exchange,提问作者Niroshan
相关产品推荐
相关产品推荐

