【问题标题】:Need help sorting multi array需要帮助排序多数组
【发布时间】:2011-01-31 10:00:13
【问题描述】:

我在这里看到了很多例子,但它对我不起作用。

我有一个从我的数据库中检索到的排序事件列表:

16.08.2010 12:00:00 - 21.08.2010 20:00:00
16.08.2010 20:00:00 - 21.08.2010 23:00:00
18.08.2010 17:00:00 - 18.08.2010 19:00:00

如您所见,第一个事件是从 16.08 到 21.08。
我需要“切碎”,以便每天获得一个条目。

这是我的功能:

  function fullList( $data ) {
    $ev = $data['events']; 
    $events = array();

    // Loop through each event. If event spans over several days, add each day in to new event list  
    foreach($ev as $e) :
      $endDate = strtotime(date('Y-m-d 23:59:59', strtotime($e->endTime)));
      $current = strtotime($e->startTime);

      // Copy event so data is not overwritten
      $newEv = $e;

      while ($current <= $endDate) {

          //Set start date of event to new date
          $newEv->startTime = date('d.m.Y H:i:s', $current);

          // Add events to new event list
          array_push($events,$newEv);

          //Go to next date
          $current = strtotime('+1 day', $current);
      }      
    endforeach;
    // Need to sort $events here
  }

现在$events 包含所有事件,但未按日期排序。我试过uasort,但我不能用uasort($array, 'cmp');

如何按日期对这个数组进行排序?

【问题讨论】:

  • 通过 MySQL ORDER BY 参数来做会更有效率。
  • 为什么不能使用 uasort(或者更合适的 usort)?
  • 仅供参考,您并没有通过将$e 分配给$newEnv 来复制它,您只是创建了另一个引用。要复制对象,请使用clone
  • @Nazariy - 从 s.time 排序的 DB 中检索初始列表。谢谢@Phil Brown - 我忘了。
  • 您可以在 ORDER 语句中使用几列并在必要时将它们分组,例如:ORDER BY event_date DESC, event_time ASC

标签: php sorting


【解决方案1】:

你试过natural sorting算法吗?

【讨论】:

    【解决方案2】:

    正如 Nazariy 所说,最好在源头对事件进行预分类(假设它们来自数据库)。

    如果您必须在代码中对数组进行排序,您应该可以使用 usort。我假设你想按startTime排序

    usort($events, function($a, $b) {
        return strtotime($a->startTime) - strtotime($b->startTime);
    });
    

    【讨论】:

    • 我在我的 Q 中添加了一些额外的信息。初始事件列表按顺序从 DB 中检索。感谢usort. 的提示,我将对此进行测试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-28
    • 2014-06-29
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    • 1970-01-01
    • 2016-09-26
    相关资源
    最近更新 更多