【问题标题】:How to sort the mysql result array in descending order on the bases of date column in php?如何根据php中日期列的降序对mysql结果数组进行排序?
【发布时间】:2017-02-05 22:19:25
【问题描述】:

我不是英语母语,并且是 stackoverflow 上的新手,所以如果我做错了事,请纠正我。 我的问题是我从两个不同的mysql数据库名称表中检索数据。

  1. 事件
  2. 留言

用于获取数据的代码如下。

$msgres=$ticket->getMessages();
$arr1 = array();
while($msg_row_one = db_fetch_array($msgres)){
    $arr1[] = $msg_row_one;
}
$noteres=$ticket->getNotes();
$arr2 = array();
while ($msg_row_two = db_fetch_array($noteres)){
    $arr2[] = $msg_row_two;
}

在这个过程之后,我正在合并两个数组。

$arr1[]

$arr2[]

像这样。

$merge = array_merge($arr1,$arr2);

然后我得到一个如下的数组。

Array
(
    [0] => Array
        (
            [msg_id] => 7563
            [ticket_id] => 1768
            [messageId] => 
            [msg_type] => R
            [message] => this is a link system . this is a link system .
            [staff_id] => 1
            [staff_name] => System Administrator
            [headers] => 
            [source] => staff
            [ip_address] => 10.12.145.174
            [created] => 2016-09-27 01:49:27
            [attachments] => 0
        )

    [1] => Array
        (
            [msg_id] => 7562
            [ticket_id] => 1768
            [messageId] => 
            [msg_type] => R
            [message] => Last message is this.
            [staff_id] => 1
            [staff_name] => System Administrator
            [headers] => 
            [source] => staff
            [ip_address] => 10.12.145.174
            [created] => 2016-09-26 08:39:46
            [attachments] => 0
        )

    [2] => Array
        (
            [msg_id] => 7561
            [ticket_id] => 1768
            [messageId] => 
            [msg_type] => R
            [message] => Last message is this.
            [staff_id] => 1
            [staff_name] => System Administrator
            [headers] => 
            [source] => staff
            [ip_address] => 10.12.145.174
            [created] => 2016-09-26 08:37:25
            [attachments] => 0
        )

    [3] => Array
        (
            [msg_id] => 7558
            [ticket_id] => 1768
            [messageId] => 
            [msg_type] => R
            [message] => mmmmmmmmmmmmmmmmmmmmmmmmmmm
            [staff_id] => 1
            [staff_name] => System Administrator
            [headers] => 
            [source] => staff
            [ip_address] => 10.12.145.174
            [created] => 2016-09-26 07:47:51
            [attachments] => 0
        )
  )

然后我按以下代码对$merge数组的日期进行降序排序。

$strdate  = array();
$formated = array();
foreach ($merge as $ascdate){
    $strdate[] = strtotime($ascdate['created']);
}
rsort($strdate);
foreach($strdate as $descdate){
    $formated[] = date('Y-m-d H:i:s',$descdate);
}

现在我想代表日期按降序对整个 $merge 数组进行排序。意味着最大的日期$merge 数组应该排在最前面。我不知道如何在$merge 数组中应用上述排序日期$formated

【问题讨论】:

标签: php mysql arrays sorting


【解决方案1】:

使用usort 对整个数组进行排序,而不仅仅是提取日期

usort($merge,function ($a,$b) {
      return $a['created'] < $b['created'];
});

【讨论】:

    【解决方案2】:

    这样做,就是你在合并两个数组后要找的,它使用数组多排序-

    function array_orderby()
    {
        $args = func_get_args();
        $data = array_shift($args);
        foreach ($args as $n => $field) {
            if (is_string($field)) {
                $tmp = array();
                foreach ($data as $key => $row)
                    $tmp[$key] = $row[$field];
                    $args[$n] = $tmp;
                }
        }
        $args[] = &$data;
        call_user_func_array('array_multisort', $args);
        return array_pop($args);
    }
    
    $arr = array(
            array('msg_id'=>123,'ticket_id'=>'32424','date'=>1233455,'created' => '2016-09-26 07:47:51'),
            array('msg_id'=>143,'ticket_id'=>'sssds','date'=>44724,'created' => '2016-09-27 07:47:51'),
            array('msg_id'=>13,'ticket_id'=>'3xxxx','date'=>434442424,'created' => '2016-10-26 07:47:51'),
            array('msg_id'=>723,'ticket_id'=>'eeeeeee','date'=>9908,'created' => '2016-06-06 17:47:51'),
            array('msg_id'=>793,'ticket_id'=>'fffff','date'=>9908,'created' => '2016-06-06 17:47:56')
        );
    echo "Before Sorting";
    print_r($arr);
    $arr = array_orderby($arr, 'created', SORT_DESC) ;
    echo "After sorting";
    print_r($arr);
    

    只要运行这个例子,你就会得到你要找的东西

    【讨论】:

      【解决方案3】:

      您可以为此使用多排序 API

      参考:示例 #3 对数据库结果进行排序

      http://php.net/manual/en/function.array-multisort.php

      <?php
      $aMultiSort = array();
      $aTimeStamp  = array();
      foreach ($merge as $key=>$ascdate){
          //create strtotime for numerical sorting
          $ascdate['timestamp'] = strtotime($ascdate['created']);
          $aMultiSort[$key] = $ascdate;
          $aTimeStamp[$key] = $ascdate['timestamp'];
      }
      
      //multi sort with timestamp desc
      array_multisort($aTimeStamp, SORT_DESC, $aMultiSort);
      

      【讨论】:

        【解决方案4】:

        在这种情况下,我可能会创建一个新方法,称为getAllComments()(或类似名称)。在这种方法中,我可能会使用JOINUNION 查询,同时从两个表/行(?)中选择所有信息。在此查询中,按日期排序非常简单,尤其是在 JOIN 查询时。

        如果是 UNION 查询,您可以将其包装在外部 SELECT 中,以便对数据进行排序。像这样的:

        SELECT * FROM (
            SELECT id, text, date FROM messages
            UNION SELECT id, text, date FROM notes
        ) ORDER BY date
        

        不需要(相对)昂贵的 PHP 排序,也不需要编写和测试代码所涉及的所有额外工作。毕竟,SQL 引擎是专门为这类操作而设计的。 :)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-04-12
          • 1970-01-01
          • 2021-04-06
          • 1970-01-01
          • 2013-01-10
          • 2021-10-25
          • 2011-02-10
          • 2016-10-15
          相关资源
          最近更新 更多