我有一个对象数组。每个对象都包含一个日期值。
根据特定日期范围过滤数组的最佳效果,其中范围指定为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]);
}
}
答案 0 :(得分:3)
这是基本的想法;你必须根据你的特定对象类型和日期类型进行调整。
foreach ($myarray as $item)
if ($item->dateitem >= $startDate &&
$item->dateitem <= $endDate)
$newarray[] = $item;
答案 1 :(得分:3)
假设您的对象包含日期的字符串表示,我们将使用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' );
答案 2 :(得分:2)
function inRange($thingy) {
return $thingy->theDate >= $startDate && $thingy->theDate < $endDate;
}
$filtered = array_filter($unfiltered, "inRange");