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而不是每次通过循环对其进行格式化,都会更有效率。

Demo on 3v4l.org

另一答案

您走在正确的轨道上。我更改了您组织数据的方式,因此遍历数据更加简单。

我在比较中也使用了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个数组之间的主要内容,如果未能解决你的问题,请参考以下文章

如何从嵌套的 ForEach 循环中获取连续的索引号?

php foreach 嵌套循环大数组很慢?

PHP:我需要嵌套的 foreach 循环还是多个数组?

PHP foreach 与嵌套数组?

打印嵌套数组关联数组php

在两列上创建索引以检查日期是不是介于这两个列之间