首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >php -根据日期显示多点数组中的前3项。

php -根据日期显示多点数组中的前3项。
EN

Stack Overflow用户
提问于 2017-03-24 15:35:50
回答 1查看 86关注 0票数 1

这就是我想要做的。我在一个多暗的数组中构造了一个位置和日期的列表。我想根据日期和地点在输出中显示接下来的3个日期。另外,我需要在任何给定时刻只显示每个位置的一个日期,所以基本上是从位置1、2和3等最近的日期,每次传递其中一个日期时,我想用下一个最近的日期来替换它。稍后我可能需要添加更多的位置,但我仍然需要在输出中显示前3个即将到来的日期。我应该用不同的方式来构造我的数组吗?

如能提供任何帮助,将不胜感激。

谢谢

代码语言:javascript
复制
$event_dates = array(
    'location-1' => array(
        'date1' => array(
            'start' =>  date('m-d-Y',strtotime('2017-7-30')),
            'end'   =>  date('m-d-Y',strtotime('2017-8-3')),
        ),

        'date2' => array(
            'start' =>  date('m-d-Y',strtotime('2018-2-18')),
            'end'   =>  date('m-d-Y',strtotime('2018-2-23')),
        ), 
        'date3' => array(
            'start' =>  date('m-d-Y',strtotime('2018-7-29')),
            'end'   =>  date('m-d-Y',strtotime('2018-8-2')),
        ), 
        'date4' => array(
            'start' =>  date('m-d-Y',strtotime('2019-1-27')),
            'end'   =>  date('m-d-Y',strtotime('2019-1-31')),
        ),
        'date5' => array(
            'start' =>  date('m-d-Y',strtotime('2019-7-28')),
            'end'   =>  date('m-d-Y',strtotime('2019-8-12')),
        ), 
        'date6' => array(
            'start' =>  date('m-d-Y',strtotime('2020-1-16')),
            'end'   =>  date('m-d-Y',strtotime('2020-1-22')),
        )   
    ),

'location-2' => array(
        'date1' => array(
            'start' =>  date('m-d-Y',strtotime('2017-7-30')),
            'end'   =>  date('m-d-Y',strtotime('2017-8-13')),
        ),

        'date2' => array(
            'start' =>  date('m-d-Y',strtotime('2018-1-8')),
            'end'   =>  date('m-d-Y',strtotime('2018-2-11')),
        ), 
        'date3' => array(
            'start' =>  date('m-d-Y',strtotime('2018-7-23')),
            'end'   =>  date('m-d-Y',strtotime('2018-8-12')),
        ), 
        'date4' => array(
            'start' =>  date('m-d-Y',strtotime('2019-1-17')),
            'end'   =>  date('m-d-Y',strtotime('2019-1-23')),
        ),
        'date5' => array(
            'start' =>  date('m-d-Y',strtotime('2020-6-16')),
            'end'   =>  date('m-d-Y',strtotime('2020-6-22')),
        )
),

 'location-3' => array(
        'date1' => array(
            'start' =>  date('m-d-Y',strtotime('2017-5-12')),
            'end'   =>  date('m-d-Y',strtotime('2017-5-19')),
        ),

        'date2' => array(
            'start' =>  date('m-d-Y',strtotime('2018-9-22')),
            'end'   =>  date('m-d-Y',strtotime('2018-9-28')),
        ), 
        'date3' => array(
            'start' =>  date('m-d-Y',strtotime('2018-3-12')),
            'end'   =>  date('m-d-Y',strtotime('2018-3-20')),
        ), 
        'date4' => array(
            'start' =>  date('m-d-Y',strtotime('2019-12-9')),
            'end'   =>  date('m-d-Y',strtotime('2019-12-15')),
        ),
        'date5' => array(
            'start' =>  date('m-d-Y',strtotime('2020-11-16')),
            'end'   =>  date('m-d-Y',strtotime('2020-11-20')),
        )
));
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-07 05:34:52

我是DateTime来救你!

代码(演示):

代码语言:javascript
复制
$TZ=new DateTimeZone('UTC');  // make some sort of declaration on timezone
$today=new DateTime('NOW',$TZ);
$today->setTime(0,0,0);    

foreach($event_dates as $locname=>$datearray){
    foreach($datearray as $eventname=>$eventarray){  // I recommend changing 'date{n}' to an actual eventname in the array
        $end=DateTime::createFromFormat('m-d-Y',$eventarray['end'],$TZ)->setTime(0,0,0);
        if($today<=$end){
            echo "$locname's $eventname";
            $start=DateTime::createFromFormat('m-d-Y',$eventarray['start'],$TZ)->setTime(0,0,0);
            $days=abs($today->diff($start)->days);
            if($today==$start){
                echo " begins today!";
            }elseif($today==$end){
                echo " concludes today!";
            }elseif($today<$start){
                echo " starts in $days day",($days!=1?"s":"");
            }else{
                echo " is in progress for $days day",($days!=1?"s":"");
            }
            echo "\n";
            break;
        }
    }
}

输出:

代码语言:javascript
复制
location-1's date1 starts in 114 days
location-2's date1 starts in 114 days
location-3's date1 starts in 35 days

为了提供最健壮的代码,我选择将我的方法转换为允许指定显示多少个事件日期的函数。另外,我发现location-3有一个日期不正常,所以我已经包含了一个排序()来纠正这个错误。

代码:(演示)

代码语言:javascript
复制
// for this sample array, $count=6 is the same as $count=-1
function currentAndUpcomingEvents($array,$location,$count=-1){ // default to -1 which will show all
    $result=[];
    $x=0;
    $TZ=new DateTimeZone('UTC');  // make some sort of declaration on timezone
    $today=new DateTime('NOW',$TZ);
    $today->setTime(0,0,0);
    // test a specific date: $today=DateTime::createFromFormat('m-d-Y','08-13-2017',$TZ)->setTime(0,0,0);

    foreach($array[$location] as $eventname=>$daterange){
        if($x==$count){break;}
        $end=DateTime::createFromFormat('m-d-Y',$daterange['end'],$TZ)->setTime(0,0,0);
        if($today<=$end){
            $start=DateTime::createFromFormat('m-d-Y',$daterange['start'],$TZ)->setTime(0,0,0);
            $days=abs($today->diff($start)->days);
            $result[$days]="$location's $eventname";  // using $days as keys will allow sorting
            if($today==$start){
                $result[$days].=" begins today!";
            }elseif($today==$end){
                $result[$days].=" concludes today!";
            }elseif($today<$start){
                $result[$days].=" starts in $days day".($days!=1?"s":"");
            }else{
                $result[$days].=" is in progress for $days day".($days!=1?"s":"");
            }
        }
        ++$x;
    }    
    ksort($result);  // location-3's date3 was originally out of order
    return $result;
}

foreach(array_keys($event_dates) as $location){
    echo implode("\n",currentAndUpcomingEvents($event_dates,$location,6));  // whole array, level1 key, events per location count
    echo "\n\n";
}

输出:

代码语言:javascript
复制
location-1's date1 starts in 114 days
location-1's date2 starts in 317 days
location-1's date3 starts in 478 days
location-1's date4 starts in 660 days
location-1's date5 starts in 842 days
location-1's date6 starts in 1014 days

location-2's date1 starts in 114 days
location-2's date2 starts in 276 days
location-2's date3 starts in 472 days
location-2's date4 starts in 650 days
location-2's date5 starts in 1166 days

location-3's date1 starts in 35 days
location-3's date3 starts in 339 days
location-3's date2 starts in 533 days
location-3's date4 starts in 976 days
location-3's date5 starts in 1319 days
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43003592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档