【问题标题】:sorting with uasort (multiple conditions)使用 uasort 排序(多个条件)
【发布时间】:2021-04-30 11:04:12
【问题描述】:

我想使用 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];
  });

【问题讨论】:

  • 这能回答你的问题吗? How can I sort arrays and data in PHP?
  • 在链接的副本中搜索标题为“按多个字段排序”的部分。
  • @El_Vanja 谢谢你的链接。我已经看过了,但我无法弄清楚:(
  • 你尝试过写类似的东西吗?如果是这样,你能分享一下努力并解释它是如何失败的吗?您在问题中显示的代码执行两种不同的排序。
  • @El_Vanja 我试过了(顺序不正确,时间戳不正确)。如果您能给我的问题提供 if 语句,我将不胜感激。 if (($a[1] - $b[0]) > 0) { return $a[0] - $b[0]; } 返回 $a[1] - $b[1];

标签: php arrays sorting usort


【解决方案1】:

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

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

});

【讨论】:

    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-06
      • 2013-10-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多