我有一个看起来像这样的数组
$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
使用DateTime
或strtotime
转换字符串除了增加所需的时间外,什么也没增加。
无论如何,比较日期:
使用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;
}
}