为了账号安全,请及时绑定邮箱和手机立即绑定

如何从日期数组中分离日期和日期?

如何从日期数组中分离日期和日期?

PHP
守着星空守着你 2022-07-16 16:27:02
我有一个数组,它只有一个月的日期。$dates =array (            '2018-10-15',            '2018-10-16',            '2018-10-17',            '2018-10-13',            '2018-10-19',            '2018-10-10',            '2018-10-11',            '2018-10-12',            '2018-10-22',            '2018-10-23',            '2018-10-29',        );和下面的脚本usort($dates,function($a,$b){            return strtotime($a) - strtotime($b);        });        $consecutive_added_set = [];        $consecutive_array = [];        $temp = [];        $temp[] = date('Y-m-d',strtotime($dates[0]));        for($i=1;$i<count($dates);++$i){            if(strtotime($dates[$i]) - strtotime($dates[$i - 1]) === 86400){ // 1 day gap(86400 seconds)                $temp[] = date('Y-m-d',strtotime($dates[$i]));                $consecutive_added_set[$dates[$i-1]] = true;                $consecutive_added_set[$dates[$i]] = true;            }else{                if(count($temp) > 1){                    $consecutive_array[] = $temp;                   }                $temp = [];                $temp[] = date('Y-m-d',strtotime($dates[$i]));            }        }        if(count($temp) > 1){ //  the last consecutiveness match of dates as well(corner case)            $consecutive_array[] = $temp;        }        $conseq[] = []; // reset the array structure         $conseq['consecutive'] = $consecutive_array;        $conseq['consecutive_count'] = count($consecutive_array);        $conseq['non_consecutive'] = [];        foreach($dates as $current_date){            if(!isset($consecutive_added_set[$current_date])){ // skip all dates which were d for consecutiveness                $conseq['non_consecutive'][] = date('Y-m-d',strtotime($current_date));            }        }我已经尝试了很多。
查看完整描述

2 回答

?
长风秋雁

TA贡献1757条经验 获得超7个赞

一个快速的解决方法是获取数组中的第一个和最后一个项目。


    $consecutive_array = array_map(function($e){

        if(!is_array($e)){ 

            return $e;

        }

        $last = end($e);

        return [reset($e), $last];

    }, $consecutive_array);

或者按照评论中的建议使用min() max() 函数。


    $consecutive_array = array_map(function($e){

        if(!is_array($e)){ 

            return $e;

        }

        return [min($e), max($e)];

    }, $consecutive_array);


查看完整回答
反对 回复 2022-07-16
?
郎朗坤

TA贡献1921条经验 获得超9个赞

重要提示:不要指望strtodate一天比第二天的精确少 86400 秒strtodate- 根据服务器的区域设置,会有夏令时,这可能会搞砸!


在这种情况下,我倾向于比较strtodate('+1 day',$timestampOfDay1)-strtodate($timestampOfDay2)这将包括夏令时。


这是我的做法:


//the dates

$dates =array (

            '2018-10-15',

            '2018-10-16',

            '2018-10-17',

            '2018-10-13',

            '2018-10-19',

            '2018-10-10',

            '2018-10-11',

            '2018-10-12',

            '2018-10-22',

            '2018-10-23',

            '2018-10-29',


        );


//call the function

$result = getConsecutive($dates);


//output

var_dump($result);


function getConsecutive($dates) {

    sort($dates);


    $result = [

        'consecutive' => [],

        'consecutive_count'=>0,

        'non_consecutive' => []

    ];


    $currentStart = null;

    $currentTimestamp = null;


    for ($i=0; $i<count($dates); $i++) {

        $timestamp = strtotime($dates[$i]);


        if ($currentStart == null) {

            //first timestamp - set it as start & current

            $currentStart = $timestamp;

            $currentTimestamp = $timestamp;

        } else if (strtotime('+1 day',$currentTimestamp) == $timestamp) {

            //consecutive - keep waiting for a non-consecutive

            $currentTimestamp = $timestamp;

        } else {

            if ($currentTimestamp == $currentStart) {

                //we just got one

                $result['non_consecutive'][] = date('Y-m-d',$currentTimestamp);

            } else {

                //we just got more then one, so they were consecutive

                $result['consecutive']['dates'.(count($result['consecutive'])+1)] = [

                    date('Y-m-d',$currentStart),

                    date('Y-m-d',$currentTimestamp)

                ];

            }

            $currentStart = $timestamp;

            $currentTimestamp = $timestamp;

        }

    }

    //process the last timestamp

    if ($currentTimestamp == $currentStart) {

        //we just got one

        $result['non_consecutive'][] = date('Y-m-d',$currentTimestamp);

    } else {

        //we just got more then one, so they were consecutive

        $result['consecutive']['dates'.(count($result['consecutive'])+1)] = [

            date('Y-m-d',$currentStart),

            date('Y-m-d',$currentTimestamp)

        ];

    }

    $result['consecutive_count'] = count($result['consecutive']);


    return $result;

}



查看完整回答
反对 回复 2022-07-16
  • 2 回答
  • 0 关注
  • 84 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信