【问题标题】:Sorting by several array columns with usort使用 usort 按多个数组列排序
【发布时间】:2019-05-21 04:27:09
【问题描述】:

我知道我可以使用这样的方法按一列对数组进行排序:

function cmp($a, $b)
{
    return $b['column'] - $a['column'];
}

usort($array, "cmp");

这模拟了ORDER BY column DESC

如果我想模拟ORDER BY column1 DESC, column2 ASCORDER BY column1, column2 DESC 或更多列怎么办?是否可以使用 PHP,或者这几乎是 SQL 可以完成的工作?谢谢。

【问题讨论】:

    标签: php arrays array-column


    【解决方案1】:

    我相信你的意思是array-multisort

    array_multisort — 对多个或多维数组进行排序

    简单示例:

    $data[] = array('volume' => 67, 'edition' => 2);
    $data[] = array('volume' => 86, 'edition' => 1);
    $data[] = array('volume' => 85, 'edition' => 6);
    $data[] = array('volume' => 98, 'edition' => 2);
    $data[] = array('volume' => 86, 'edition' => 6);
    $data[] = array('volume' => 67, 'edition' => 7);
    
    array_multisort(array_column($data, 'volume'), SORT_DESC, array_column($data, 'edition'), SORT_ASC, $data);
    

    这将使$data 首先按 DESC 中的卷字段排序,然后按 ASC 中的版本字段排序。

    【讨论】:

    • 虽然它会按多列排序,但不会使用 usort 排序。因此,如果您有一列不仅需要比较功能,则必须使用 usort。问题是“...with usort” :)
    • 从字面上看,你是对的,你的解决方案也可以正常工作。但我认为这就是 OP 真正想要的,即使他不知道......
    【解决方案2】:

    这很容易。按多列排序意味着如果第一个排序标准相等,您只需使用另一个排序标准:

    function cmp($a, $b)
    {
      if ($a['col1'] !== $b['col1']) {
        return $b['col1'] - $a['col1'];
      }
      return $a['col2'] - $b['col2'];
    }
    
    usort($array, 'cmp');
    

    这和ORDER BY col1 DESC, col2 ASC一样

    虽然它看起来比多排序要多一些代码,但它更灵活。取决于你是否想计算里面的东西。例如:按列的长度排序。

    【讨论】:

      【解决方案3】:

      你可以使用foreach循环,$data排序。

      <?php
         $data[] = array('volume' => 67, 'edition' => 2);
      $data[] = array('volume' => 86, 'edition' => 1);
      $data[] = array('volume' => 85, 'edition' => 6);
      $data[] = array('volume' => 98, 'edition' => 2);
      $data[] = array('volume' => 86, 'edition' => 6);
      $data[] = array('volume' => 67, 'edition' => 7);
      
      // Obtain a list of columns
      foreach ($data as $key => $row) {
          $volume[$key]  = $row['volume'];
          $edition[$key] = $row['edition'];
      }
      
      // Sort the data with volume descending, edition ascending
      // Add $data as the last parameter, to sort by the common key
      array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data);
      var_dump($data);
      

      工作DEMO

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-16
        • 2023-03-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多