【问题标题】:`usort` not sorting array elements as intended`usort` 未按预期对数组元素进行排序
【发布时间】:2020-10-26 18:31:02
【问题描述】:

我正在使用usort 根据sales 键值上的数字对数组进行排序。这就是我所拥有的:

更正:14 不是问题,而是 9 以上。

$arr = array(

  "a" => array("sales" => 4),
  "b" => array("sales" => 3),
  "c" => array("sales" => 2),
  "d" => array("sales" => 3),
  "e" => array("sales" => 4),
  "f" => array("sales" => 14),
  "g" => array("sales" => 1)

);

$reverse_arr = $arr;

usort($reverse_arr, 'cmp');

print_r( $reverse_arr );

function cmp($a, $b) {
    return strcmp($a['sales'], $b['sales']);
}

排序对大部分部分都有效,但只有当值为14 时,它才会表现得奇怪。具有 14 个销售额的项目被放置在不应该放置的位置。这是输出:

Array
(
    [0] => Array
        (
            [sales] => 1
        )

    [1] => Array
        (
            [sales] => 14
        )

    [2] => Array
        (
            [sales] => 2
        )

    [3] => Array
        (
            [sales] => 3
        )

    [4] => Array
        (
            [sales] => 3
        )

    [5] => Array
        (
            [sales] => 4
        )

    [6] => Array
        (
            [sales] => 4
        )

)

知道为什么会发生这种情况以及如何解决这个问题吗?

【问题讨论】:

  • 因为strcmp 比较的是字符串,而不是数字/整数。 return $a['sales'] <=> $b['sales']; 就够了。
  • @u_mulder 这样一个简单的解决方案,我对 PHP 函数不是很熟悉,并且从一个非常流行的 SO 线程中获得了整个代码,用于对数组元素进行排序。感谢您指出问题!
  • @u_mulder 请不要将答案发布为 cmets。在这种情况下,您实际上发布了比当前页面上的答案更好的答案,但由于您将其作为评论发布,因此无法正确投票或接受。
  • @DeepakKamat 也许您可以建议对您阅读代码的答案进行修改,以包括<=>cmp 的示例,或者提及它们之间的区别。
  • 请不要告诉我应该在哪里写什么)

标签: php sorting usort


【解决方案1】:

你正在比较数字,但使用字符串比较函数来做,试试这个

function cmp($a, $b) {
    //return strcmp($a['sales'], $b['sales']);
    return $a['sales'] <=> $b['sales'];
}

结果

Array
(
    [0] => Array
        (
            [sales] => 1
        )

    [1] => Array
        (
            [sales] => 2
        )

    [2] => Array
        (
            [sales] => 3
        )

    [3] => Array
        (
            [sales] => 3
        )

    [4] => Array
        (
            [sales] => 4
        )

    [5] => Array
        (
            [sales] => 4
        )

    [6] => Array
        (
            [sales] => 14
        )

【讨论】:

  • 谢谢!另一位用户也在 cmets 中发布了该解决方案,但既然您将此作为答案发布,我将接受这一点。另外,$a['sales'] &lt;=&gt; $b['sales'];$a['sales'] &gt; $b['sales'] 之间有什么区别?常识说它检查大于/等于等,后者只检查大于,但 PHP 又是奇怪的。
猜你喜欢
  • 2014-10-19
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 2012-01-29
  • 2018-08-08
  • 2018-02-01
  • 2016-02-01
相关资源
最近更新 更多