在 php 中抓取 2 个日期之间的信息



我有一个看起来像这样的数组

$data =
[
[
'date' => '2020-10-01',
'product' => 'Product 1',
'description' => 'Product 1',
],
[
'date' => '2020-11-01',
'product' => 'Product 2',
'description' => 'Product 2',
],
[
'date' => '2020-12-01',
'product' => 'Product 3',
'description' => 'Product 3',
],
[
'date' => '2021-01-01',
'product' => 'Product 4',
'description' => 'Product 4',
]
];

我想做的是获取 2 个日期之间的所有信息。 例如,我想要 2021-01-01 和 2020-11-01 之间的所有内容,然后它将显示产品 2、产品 3 和产品 4

我不知道该怎么做

<?php
$data =
[
[
'date' => '2020-10-01',
'product' => 'Product 1',
'description' => 'Product 1',
],
[
'date' => '2020-11-01',
'product' => 'Product 2',
'description' => 'Product 2',
],
[
'date' => '2020-12-01',
'product' => 'Product 3',
'description' => 'Product 3',
],
[
'date' => '2021-01-01',
'product' => 'Product 4',
'description' => 'Product 4',
]
];

$from = new DateTime('2020-11-11');
$to = new DateTime('2030-10-13');

foreach ($data as $d){
$productDate = new DateTime($d['date']);
if (($productDate >= $from) && ($productDate <= $to)){
echo "is between";
var_dump($d);
}

}

如果你想在PHP中这样做,你可以创建一个类似于SQL的函数。之间。。。和。。。使用array_filter。

如果您有权访问SQL查询,那么您可能希望让DBMS处理此问题,如注释中@RiggsFolly所述。

$lowerBound = strtotime('2020-11-01');
$upperBound = strtotime('2021-01-01');
$result = array_filter($data, function ($item) use ($lowerBound, $upperBound) {
$itemDate = strtotime($item['date']); 
return $lowerBound <= $itemDate && $itemDate <= $upperBound;
});
echo '<pre>';
print_r($result);
echo '</pre>';

根据注释,如果数据最初来自数据库查询,则最好限制那里的内容,例如:

// SQL query to be used in a prepared statement
SELECT date, product, description
FROM products 
WHERE date >= ?
AND date <= ?

但是,如果做不到这一点,这里的关键是日期的格式都正确:timetamps遵循模式Y-m-d这意味着时间顺序和字母顺序是相同的

Generally...
Start        ===>   End
A            ===>   Z
1            ===>   10
0000-00-00   ===>   9999-99-99
Which means...
2020-12-30 < 2020-12-31 < 2021-01-01

在这种情况下,当我们比较两个格式正确的日期(以相同的格式)时,我们不需要更改数据类型/格式;与比较字符串格式的值相比~10x使用DateTimestrtotime转换字符串除了增加所需的时间外,什么也没增加。

无论如何,比较日期:

使用array_filter

$minDate = '2020-11-01';
$maxDate = '2021-01-01';
$result  = array_filter($data, function ($item) use ($minDate, $maxDate) {
return $minDate <= $item["date"] && $item["date"] <= $maxDate;
});

使用foreach

$minDate = '2020-11-01';
$maxDate = '2021-01-01';
$result  = [];
foreach($data as $item){
if($minDate <= $item["date"] && $item["date"] <= $maxDate){
$result[] = $item;
}
}

最新更新