【问题标题】:PHP asort by value ASC, value 0 should go lastPHP 按值 ASC 排序,值 0 应该排在最后
【发布时间】:2021-09-28 10:09:40
【问题描述】:

我有以下数组:

$values = [
  'a' => 0,
  'b' => 1,
  'c' => 0,
  'd' => 3,
  'e' => 2
];

我需要能够像这样对其进行排序:

$values = [
  'b' => 1,
  'e' => 2,
  'd' => 3,
  'a' => 0,
  'c' => 0
];

我想出的最快的解决方案是:

$zero = array_filter($values, fn($val) => $val === 0);

$non_zero = array_diff_assoc($values, $zero);
asort($non_zero);

$result = array_merge($non_zero, $zero);

排序规则:

  • 需要保留密钥
  • 对于相同的值,键顺序无关紧要

我的问题是:有没有更好的方法来做到这一点?

Here is a sandbox version

谢谢!

更新

看起来这个也可以:

asort($values);
uasort($values, function($a, $b){
    return $a === 0 ? 1 : -1;
});

Sandbox for this version

有更好的想法吗?

【问题讨论】:

  • 你必须保留你的索引吗?
  • @CarlosCarucce 是的

标签: php algorithm sorting php-7.4


【解决方案1】:

我设法想出了这个看起来不错的解决方案:

$values = [
  'i' => 2,
  'a' => 0,
  'b' => 1,
  'f' => 1,
  'c' => 0,
  'd' => 3,
  'g' => 3,
  'e' => 2,
  'h' => 3,
];

uasort($values, function($a, $b){
    if ($a === 0) {
        return 1;
    }
    
    if ($b === 0 || $a === $b) {
        return 0;
    }
    
    return $a < $b && $b !== 0 ? -1 : 1;
});

它似乎在所有情况下都返回了预期的输出:

Array
(
    [b] => 1
    [f] => 1
    [i] => 2
    [e] => 2
    [d] => 3
    [g] => 3
    [h] => 3
    [c] => 0
    [a] => 0
)

【讨论】:

  • 如果您的数组只包含整数值,那么这可以正常工作。但是,像 0.0 这样的值将令人失望。可能一个松散的比较会为你做。
  • @Rain 我永远不会有负值或 0.0 。它实际上比较价格并将 0 放在最后。价格是浮点数,它似乎工作正常。除了 0.0 之外,你还有什么情况会导致它失败吗?
  • 好吧,既然价格是float,那么是的,(float)0 也会失败。
  • (float)0 永远不会发生。因为在需要进行排序之前计算价格的方式
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-03
  • 2012-02-12
  • 2017-07-07
  • 1970-01-01
  • 1970-01-01
  • 2012-03-19
相关资源
最近更新 更多