使用uasort排序(多个条件)

问题描述 投票:0回答:2

我想使用 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'
        )
)

我期望的输出应该是这样的(对时间戳 asc [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, function ($a, $b) {
    return $a[1] - $b[1];
  });
php arrays sorting usort
2个回答
2
投票

应该按照索引1升序排序,然后按照索引0(时间戳)升序排序。 “spaceship”运算符 <=> 和“Elvis”运算符 ?: 对于智能解决方案非常有用。

$in = [
    [1612134001, 1, 'a'],
    [1612134000, 1, 'b'],
    [1612171201, 0, 'c'],
    [1612171200, 0, 'd'],
    [1612220400, 1, 'e'],
];

//sort
usort($in, function ($a, $b) {
  return $a[1] <=> $b[1]  //first 
      ?: $a[0] <=> $b[0]  //second
  ;}
);

//Test
$expected = [
  [1612171200, 0, 'd'],
  [1612171201, 0, 'c'],
  [1612134000, 1, 'b'],
  [1612134001, 1, 'a'],   
  [1612220400, 1, 'e'],
];

var_dump($in === $expected);  //bool(true)

0
投票

经过一番测试,这似乎有效

$in = [
    [1612134001, 1, 'd'],
    [1612134000, 1, 'c'],
    [1612171201, 0, 'b'],
    [1612171200, 0, 'a'],
    [1612220400, 1, 'e'],
    [1612133999, 1, '??'],
];


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;
    }

});
© www.soinside.com 2019 - 2024. All rights reserved.