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);
排序规则:
- 需要保留密钥
- 相同值的键顺序无关紧要
我的问题是:有更好的方法吗?
谢谢!
更新
看起来这个也可以:
asort($values);
uasort($values, function($a, $b){
return $a === 0 ? 1 : -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
)
我有以下数组:
$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);
排序规则:
- 需要保留密钥
- 相同值的键顺序无关紧要
我的问题是:有更好的方法吗?
谢谢!
更新
看起来这个也可以:
asort($values);
uasort($values, function($a, $b){
return $a === 0 ? 1 : -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
)