【问题标题】:Sort Multi-dimensional Array by given indexes - PHP?按给定索引对多维数组进行排序 - PHP?
【发布时间】:2015-11-02 21:33:53
【问题描述】:

我有两个数组$days_order$mysql_result,我想使用$days_order 数组对$mysql_result 数组进行排序。我想以天数升序显示 MySQL 结果?有什么方法可以做到这一点或任何其他方式,以便我可以在OrderBy 部分的 MySQL 查询中传递$days_order

$days_order =  Array([0] => 2[1] => 3[2] => 4[3] => 5 [4] => 6[5] => 7[6] => 1);

$mysql_result = Array (

    [0] => Array
        (
            [hashtag] => a7e87329b5eab8578f4f1098a152d6f4
            [title] => Flower
            [day] => 3
        )

[1] => Array
    (
        [hashtag] => b24ce0cd392a5b0b8dedc66c25213594
        [title] => Free
        [day] => 2
    )

[2] => Array
    (
        [hashtag] => e7d31fc0602fb2ede144d18cdffd816b
        [title] => Ready
        [day] => 1
    )
)

我想要$days_order中的排序数组

输出:

  Array
(
  [0] => Array
    (
           [hashtag] => b24ce0cd392a5b0b8dedc66c25213594
           [title] => Free
           [day] => 2
    )
  [1] => Array
        (
            [hashtag] => a7e87329b5eab8578f4f1098a152d6f4
            [title] => Flower
            [day] => 3
        )

  [2] => Array
    (
           [hashtag] => e7d31fc0602fb2ede144d18cdffd816b
           [title] => Ready
           [day] => 1
    )    
)

【问题讨论】:

    标签: php mysql arrays sorting multidimensional-array


    【解决方案1】:

    usort 与自定义比较功能一起使用。

    类似:

    usort($ranked, function($a, $b) {
        if ($a['day'] === $b['day']) return 0;
    
        return ($a['day'] > $b['day']) ? -1 : 1;
    });
    

    您可以阅读有关此功能的更多信息here

    【讨论】:

      【解决方案2】:

      我使用以下脚本进行了此操作:

      function sort_array_custom_compare($mysql_result,$days_order)
          {
          uasort($mysql_result, function($a,$b) use ($days_order){
              foreach($days_order as $value){
                  if($a['day'] == $value){
                      return 0;
                      break;
                  }
                  if($b['day'] == $value){
                      return 1;
                      break;
                  }
              }
          });
          return $mysql_result;
          }
      

      【讨论】:

      【解决方案3】:

      您可以在usort的比较函数中use自定义订单数组,如下所示:

      usort($mysql_result, function ($a, $b) use ($days_order) {
          // Then check the position of the 'day' value of each element 
          // against the position of that value in $days_order.
          $a = array_search($a['day'], $days_order);
          $b = array_search($b['day'], $days_order);
          if ($a < $b) return -1;
          if ($a == $b) return 0;
          return 1;
      });
      

      如果您想在 MySQL 中执行此操作,只需像这样将日期向前移动,您可以使用

      ORDER BY (`day` + 1) % 7
      

      或者如果它需要比仅仅换一天更复杂,你可以使用 CASE 来提供一个特定的订单(尽管这个 CASE 只是做同样的事情):

      ORDER BY 
      CASE 
          WHEN `day` = 2 THEN 0
          WHEN `day` = 3 THEN 1
          WHEN `day` = 4 THEN 2
          WHEN `day` = 5 THEN 3
          WHEN `day` = 6 THEN 4
          WHEN `day` = 7 THEN 5
          WHEN `day` = 1 THEN 6
      END;
      

      【讨论】:

        猜你喜欢
        • 2015-08-27
        • 2021-09-14
        • 1970-01-01
        • 2018-09-22
        • 2011-12-17
        • 2012-06-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多