PHP嵌套foreach,增加两个索引/检查日期是否在2个数组之间
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP嵌套foreach,增加两个索引/检查日期是否在2个数组之间相关的知识,希望对你有一定的参考价值。
快速问题:有没有办法同时增加两个foreach循环?
我有2个数组:
$datum = new DateTime("now");
$jaar = date("y",strtotime('now'));
$maand = strftime("%B");
$vakanties_start = array(
"BeginKerst" => new DateTime("$jaar-01-01"),
"Voorjaar" => new DateTime("$jaar-02-22"),
"Mei" => new DateTime("$jaar-04-25"),
"Zomer" => new DateTime("$jaar-07-18"),
"EindKerst" => new DateTime("$jaar-12-21"),
"Test" => new DateTime("$jaar-05-20")
);
$vakanties_eind = array(
"BeginKerst" => new DateTime("$jaar-01-05"),
"Voorjaar" => new DateTime("$jaar-03-01"),
"Mei" => new DateTime("$jaar-05-03"),
"Zomer" => new DateTime("$jaar-08-30"),
"EindKerst" => new DateTime("$jaar-12-31"),
"Test" => new DateTime("$jaar-05-25")
);
假期开始和假期结束。我需要检查今天是否在那些日子之间。
我已经尝试通过2个foreach循环进行检查,但是我将得到以下错误:开始休假:1-1假期结束:5-1
开始:1-1结束:3-1
等等等。这显然不是我想要的方式,因为这意味着在第一个foreach结束时,假期在1-1和31-12之间。
我尝试过的其他事情是像这样验证数组的键:
foreach ($vakanties_start as $vakantie_start)
foreach ($vakanties_eind as $vakantie_eind)
if ($vakantie_start->format('Y-m-d') >= $datum->format('Y-m-d') && $vakantie_eind->format('Y-m-d') <= $datum->format('Y-m-d'))
if (key($vakantie_start) == key($vakantie_eind))
echo $vakantie_start->format('Y-m-d') . "<br>" . key($vakanties_start) . "<br>";
echo $vakantie_eind->format('Y-m-d') . "<br>" . key($vakanties_eind) . "<br>";
但这使代码仅显示1-1至5-1日期。有人可以指引我正确的方向吗?也许我做错了,但我不知道该怎么办
答案
您可以在$key => $value
上使用foreach
语句的$vakanties_start
版本,并使用该键访问$vakanties_eind
中的相应值:
$datum = (new DateTime("now"))->format('Y-m-d');
$jaar = date("y",strtotime('now'));
$maand = strftime("%B");
$vakanties_start = array(
"BeginKerst" => new DateTime("$jaar-01-01"),
"Voorjaar" => new DateTime("$jaar-02-22"),
"Mei" => new DateTime("$jaar-04-25"),
"Zomer" => new DateTime("$jaar-07-18"),
"EindKerst" => new DateTime("$jaar-12-21"),
"Test" => new DateTime("$jaar-05-20")
);
$vakanties_eind = array(
"BeginKerst" => new DateTime("$jaar-01-05"),
"Voorjaar" => new DateTime("$jaar-03-01"),
"Mei" => new DateTime("$jaar-05-03"),
"Zomer" => new DateTime("$jaar-08-30"),
"EindKerst" => new DateTime("$jaar-12-31"),
"Test" => new DateTime("$jaar-05-25")
);
foreach ($vakanties_start as $key => $vakantie_start)
$vakantie_eind = $vakanties_eind[$key];
if ($vakantie_start->format('Y-m-d') <= $datum && $vakantie_eind->format('Y-m-d') >= $datum)
echo $vakantie_start->format('Y-m-d') . "<br>" . key($vakanties_start) . "<br>";
echo $vakantie_eind->format('Y-m-d') . "<br>" . key($vakanties_eind) . "<br>";
产出(截至2020-05-24):
2020-05-20<br>BeginKerst<br>2020-05-25<br>BeginKerst<br>
[请注意,您的代码中有一个错误,您正在比较start>=today && today>=end
应该在哪里start<=today && today<=end
。同样,从一开始就格式化$datum
而不是每次通过循环对其进行格式化,都会更有效率。
另一答案
您走在正确的轨道上。我更改了您组织数据的方式,因此遍历数据更加简单。
我在比较中也使用了DateTime()
对象,因为它们具有可比性。无需先将它们格式化为字符串。
$jaar = date('Y');
$vakanties = [
'BeginKerst' => [
'start' => new DateTime("$jaar-01-01"),
'end' => new DateTime("$jaar-01-05"),
],
'Voorjaar' => [
'start' => new DateTime("$jaar-02-22"),
'end' => new DateTime("$jaar-03-01"),
],
'Mei' => [
'start' => new DateTime("$jaar-04-25"),
'end' => new DateTime("$jaar-05-03"),
],
'Zomer' => [
'start' => new DateTime("$jaar-07-18"),
'end' => new DateTime("$jaar-08-30"),
],
'EindKerst' => [
'start' => new DateTime("$jaar-12-21"),
'end' => new DateTime("$jaar-12-31"),
],
'Test' => [
'start' => new DateTime("$jaar-05-20"),
'end' => new DateTime("$jaar-05-25"),
],
];
$now = new DateTime();
foreach ($vakanties as $vakanty)
if ($now >= $vakanty['start'] && $now <= $vakanty['end'])
echo "today is in the middle of a vacation";
以上是关于PHP嵌套foreach,增加两个索引/检查日期是否在2个数组之间的主要内容,如果未能解决你的问题,请参考以下文章