如何解决使用 uasort 排序多个条件
我想使用 uasort 对多维数组进行排序。数组如下所示:
Array
(
[0] => Array
(
[0] => 1612134001
[1] => 1
[2] => 'a'
)
[1] => Array
(
[0] => 1612134000
[1] => 1
[2] => 'b'
)
[2] => Array
(
[0] => 1612171201
[1] => 0
[] => 'c'
)
[3] => Array
(
[0] => 1612171200
[1] => 0
[] => 'd'
)
[4] => Array
(
[0] => 1612220400
[1] => 1
[2] => 'e'
)
)
我希望输出应该是这样的(按 [0] 排序时间戳,但如果 [1] 是 0,则将其放在上面,但仍要考虑时间戳):
Array
(
[0] => Array
(
[0] => 1612171200
[1] => 0
[] => 'd'
)
[0] => Array
(
[0] => 1612171201
[1] => 0
[] => 'c'
)
[1] => Array
(
[0] => 1612134000
[1] => 1
[2] => 'b'
)
[2] => Array
(
[0] => 1612134001
[1] => 1
[2] => 'a'
)
[3] => Array
(
[0] => 1612220400
[1] => 1
[2] => 'e'
)
)
我尝试过 uasort,但它们相互覆盖。是否可以在一个 uasort 中做到这一点?我找不到任何关于它的信息。
uasort($array,function ($a,$b) {
return $a[0] - $b[0];
});
uasort($array,$b) {
return $a[1] - $b[1];
});
解决方法
经过一些测试,这似乎有效
$in = [
[1612134001,1,'d'],[1612134000,'c'],[1612171201,'b'],[1612171200,'a'],[1612220400,'e'],[1612133999,'??'],];
uasort($in,function ($a,$b) {
if ($a[1] == $b[1] && $a[0] == $b[0]) {
return 0;
}
if ($a[1] < $b[1]){
return -1;
}else if ($a[0] < $b[0] && $a[1] == $b[1]) {
return -1;
} else {
return 1;
}
});
,
先按照索引1升序排序,再按照索引0(时间戳)升序排序。 'spaceship' 运算符 和 'Elvis' 运算符 ?: 对于智能解决方案非常有用。
$in = [
[1612134001,];
//sort
usort($in,$b) {
return $a[1] <=> $b[1] //first
?: $a[0] <=> $b[0] //second
;}
);
//Test
$expected = [
[1612171200,[1612134001,];
var_dump($in === $expected); //bool(true)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。