【问题标题】:PHP: Filter array by date rangePHP:按日期范围过滤数组
【发布时间】:2012-05-21 05:45:51
【问题描述】:

我有一个对象数组。每个对象都包含一个日期值。

根据特定日期范围过滤数组的最佳方法是什么,其中范围指定为 startDate 和 endDate?


更新:

感谢您的回复,我最后使用了这个代码:

 foreach ($myArray as $key => &$value)
 {
      $d = DateTime::createFromFormat(self::DATE_FORMAT, $value["orderDate"]); 
      if ($d->getTimestamp() < $startDateTime->getTimestamp() || $d->getTimestamp() > $endDateTime->getTimestamp())
      {
           unset($myArray[$key]);
      }
 }

【问题讨论】:

  • 如果碰巧这些对象来自数据库,您还可以更改 SQL 查询以返回已按日期排序的结果。你会使用 ORDER BY 关键字..

标签: php arrays


【解决方案1】:

这是基本思想;您必须针对您的特定对象类型和日期类型对其进行调整。

foreach ($myarray as $item)
    if ($item->dateitem >= $startDate  &&  
        $item->dateitem <= $endDate)
            $newarray[] = $item;

【讨论】:

    【解决方案2】:

    假设您的对象包含日期的字符串表示,我们将使用 strtotime() 将其转换为数字时间戳。

    过滤掉不在给定范围内的所有内容(保持与开始/结束值匹配的值):

     $rangeStart = strtotime('-1 year');
     $rangeEnd = strtotime('yesterday');
    
     array_filter( $array, function($var) use ($rangeStart, $rangeEnd) {
        $utime = strtotime($var->date);
        return $utime <= $rangeEnd && $utime >= $rangeStart;
     });
    

    按日期对数组进行排序:

     function cmp($a, $b) {
        $aTime = strtotime($a->date);
        $bTime = strtotime($b->date);
    
        if( $aTime === $bTime ) { return 0; }
        else { return $aTime < $bTime? -1 : 1; }
     }
    
     usort( $array, 'cmp' );
    

    【讨论】:

    • 回答不同的问题。
    • 哈!我回答了一半,忘记了我在回答什么。所以你也得到了排序。我想我会去泡茶:)
    【解决方案3】:
    function inRange($thingy) {
      return $thingy->theDate >= $startDate && $thingy->theDate < $endDate;
    }
    
    $filtered = array_filter($unfiltered, "inRange");
    

    【讨论】:

      猜你喜欢
      • 2021-05-25
      • 1970-01-01
      • 1970-01-01
      • 2012-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-19
      相关资源
      最近更新 更多