PHP 按值 ASC 排序,值 0 应排在最后

PHP asort by value ASC, value 0 should go last

我有以下数组:

$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

有更好的主意吗?

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

$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
)