PHP 按数组 value 精准排序

| 选择喜欢的代码风格  

<=> 是 PHP 中的 太空船操作符 - Spaceship Operator,它用于比较两个表达式。这个操作符返回以下三种可能的值之一:

  • -1 如果左边的表达式小于右边的表达式。
  • 0 如果两个表达式相等。
  • 1 如果左边的表达式大于右边的表达式。

<?php
$a = 5;
$b = 10;

echo $a <=> $b; // 输出 -1,因为 5 小于 10

这个操作符常用于排序函数中,比如 usort,可以很方便地进行数值或字符串的比较,但注意下面的方法是不精准的:

<?php

// 不精准,强烈不推荐
usort($hotels, function($a, $b) {
    return $b['value'] - $a['value']; // 降序排序
    // 如果要升序排序,可以使用 $a['value'] - $b['value'];
});

PHP 使用太空船操作符,是正确的用法:

<?php

// 太空船操作符 - 正确用法
usort($array, function($a, $b) {
    return $b['value'] <=> $a['value'];
});

为了更形象的对比上面2种方式导致的 PHP 数组排序结果问题,这里给出测试示例:

<?php

$hotels = array(
    array('name' => '北京', 'value' => 20.1),
    array('name' => '镇江', 'value' => 15),
    array('name' => '厦门', 'value' => 10.1),
    array('name' => '遵义', 'value' => 8.6),
    array('name' => '天津', 'value' => 9),
    array('name' => '济南', 'value' => 4.6),
    array('name' => '上海', 'value' => 2.8)
);

# 可以分别用 <=> 和 $b['value'] <=> $a['value'] 对比,
# 发现太空操作符 <=> 返回的排序结果最正确

使用 return $b['value'] - $a['value']; 是可以实现排序的,但确实不如 <=> 操作符精准,尤其是在以下情况下:

  • 浮点数精度问题:在减法操作中,如果 value 是浮点数,可能会遇到精度问题。例如,计算浮点数的差值可能导致微小的误差,从而影响排序结果。
  • 非数值数据:如果 value 包含非数值(如字符串或混合类型),减法操作会导致错误,而 <=> 操作符可以处理这些情况。
  • 返回值的限制:减法操作只能返回一个数值,而 <=> 操作符专门为比较设计,明确返回 -101,直接表达比较结果的大小关系。
因此,虽然 return $b['value'] - $a['value']; 在大多数情况下可以工作,但使用 <=> 操作符更稳健,更适合排序函数的语义要求

PHP <=> 精准数组 value 排序扩展阅读:




发表评论