第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

PHP獲取日期數(shù)組,從一個長日期范圍中分割出來

PHP獲取日期數(shù)組,從一個長日期范圍中分割出來

PHP
翻閱古今 2022-06-17 16:04:47
參考我的原始帖子(PHP split data range to get only chunks free),我做了一些實現(xiàn),以獲得更好的結(jié)果,但在某些情況下仍然不正確。我的目標(biāo)是拆分原始范圍日期,以僅獲得未被活動占用的空閑塊。這是我在 php 中的實際腳本:function date_compare($a, $b){    $t1 = strtotime($a['start']);    $t2 = strtotime($b['start']);    return $t1 - $t2;} $fullrange = array(   // <----------------------------------- one month range to split   "start" => "2019-12-01 00:00:00",   "end" => "2019-12-31 23:59:59");$result[] = $fullrange;$array_activities = array( // <--------------------------- activities (busy ranges)  0 => array(      "start" => "2019-12-08 09:00:00",      "end" => "2019-12-08 10:00:00"  ),  1 => array(      "start" => "2019-12-07 09:00:00",      "end" => "2019-12-07 17:40:00"  ),  2 => array(      "start" => "2019-12-10 10:00:00",      "end" => "2019-12-15 17:00:00"  ),  3 => array(      "start" => "2019-12-11 08:00:00",      "end" => "2019-12-17 21:00:00"  ),  4 => array(      "start" => "2019-12-08 08:57:05",      "end" => "2019-12-08 19:00:00"  ),  5 => array(      "start" => "2019-12-04 10:00:00",      "end" => "2019-12-05 17:00:00"  ),    6 => array(      "start" => "2019-12-20 10:00:00",      "end" => "2019-12-31 23:59:59"  ),    7 => array(      "start" => "2019-12-16 10:00:00",      "end" => "2019-12-31 23:59:59"  ));// reorder array of activities by date start  usort($array_activities, 'date_compare');foreach ( $array_activities as $index_1 => $array_activity ) {foreach ($result as $index_2 => $r) {    if ( $r['start'] < $array_activity['start'] && $array_activity['start'] < $r['end'] ) {        $temp = new Datetime($array_activity['start']);        $temp->modify("-1 second");        $result[$index_2]['end'] = $temp->format("Y-m-d H:i:s");        if ( $r['start'] < $array_activity['end'] && $array_activity['end'] < $r['end'] ) {        $result[] = array("start" => $array_activity['start'], "end" => $r['end']);        }    }}
查看完整描述

2 回答

?
波斯汪

TA貢獻(xiàn)1811條經(jīng)驗 獲得超4個贊

以下功能應(yīng)該做到這一點(如果我沒有錯過任何東西)。對于每個活動,它會遍歷所有空閑范圍,檢查活動是否重疊并相應(yīng)地調(diào)整/創(chuàng)建新范圍。


請注意,理想情況下,您的“句點”條目應(yīng)該是對象(具有start和end作為DateTime屬性),以便為函數(shù)提供更強(qiáng)的簽名/減少多余代碼的數(shù)量。


function getFreeTimeRanges(array $fullRange, array $activities): array

{

  $freeRanges = [[

    'start' => new \DateTime($fullRange['start']), 

    'end' => new \DateTime($fullRange['end'])

  ]];


  foreach ($activities as $activity) {

    $activityStart = new \DateTime($activity['start']);

    $activityEnd = new \DateTime($activity['end']);


    foreach ($freeRanges as &$range) {

      $activityIsOverlapping = $activityStart < $range['end'] 

          && $activityEnd > $range['start'];


      if ($activityIsOverlapping) {

        $activityStartsLater = $activityStart > $range['start'];

        $activityEndsBefore = $activityEnd < $range['end'];


        if ($activityStartsLater) {

          if ($activityEndsBefore) {

            $freeRanges[] = [

              'start' => $activityEnd->modify('+1 second'), 

              'end' => $range['end']

            ];

          }

          $range['end'] = $activityStart->modify('-1 second');

        }

        elseif ($activityEndsBefore) {

          $range['start'] = $activityEnd->modify('+1 second');

        }

      }

    }

  }


  uasort($freeRanges, static function (array $range1, array $range2) {

    return $range1['start'] <=> $range2['start'];

  });


  return array_map(static function ($range) {

    return [

      'start' => $range['start']->format('Y-m-d H:i:s'), 

      'end' => $range['end']->format('Y-m-d H:i:s')

    ];

  }, $freeRanges);

}


$fullRange = ['start' => '2019-12-01 00:00:00', 'end' => '2019-12-31 23:59:59'];

$activities = [

  0 => ['start' => '2019-12-08 09:00:00', 'end' => '2019-12-08 10:00:00'],

  1 => ['start' => '2019-12-07 09:00:00', 'end' => '2019-12-07 17:40:00'],

  2 => ['start' => '2019-12-10 10:00:00', 'end' => '2019-12-15 17:00:00'],

  3 => ['start' => '2019-12-11 08:00:00', 'end' => '2019-12-17 21:00:00'],

  4 => ['start' => '2019-12-08 08:57:05', 'end' => '2019-12-08 19:00:00'],

  5 => ['start' => '2019-12-04 10:00:00', 'end' => '2019-12-05 17:00:00'],

  6 => ['start' => '2019-12-20 10:00:00', 'end' => '2019-12-31 23:59:59'],

  7 => ['start' => '2019-12-16 10:00:00', 'end' => '2019-12-31 23:59:59']

];


print_r(getFreeTimeRanges($fullRange, $activities));

演示:https ://3v4l.org/p8Kvl


查看完整回答
反對 回復(fù) 2022-06-17
?
明月笑刀無情

TA貢獻(xiàn)1828條經(jīng)驗 獲得超4個贊

這可能適用于所有情況:


foreach ( $array_activities as $index_1 => $array_activity ) {


    foreach ($result as $index_2 => $r) {


        if ( $r['start'] < $array_activity['start'] && $array_activity['start'] < $r['end'] ) {


            $temp = new Datetime($array_activity['start']);

            $temp->modify("-1 second");


            $result[$index_2]['end'] = $temp->format("Y-m-d H:i:s");


            if ( $r['start'] < $array_activity['end'] && $array_activity['end'] < $r['end'] ) {


            $result[] = array("start" => $array_activity['start'], "end" => $r['end']);


            }


        } else {


            if ( $array_activity['start'] <= $r['start'] && $array_activity['end'] >= $r['end'] ) {

                unset($result[$index_2]);   

            }


        }


    }



    foreach ($result as $index_2 => $r) {


        if ( $r['start'] < $array_activity['end'] && $array_activity['end'] < $r['end'] ) {


            $temp = new Datetime($array_activity['end']);

            $temp->modify("+1 second");


            $result[$index_2]['start'] = $temp->format("Y-m-d H:i:s");

            $result[$index_2]['end'] = $r['end'];



        }


    }




    echo '<pre>';

var_dump($result);

echo '</pre>';



}


查看完整回答
反對 回復(fù) 2022-06-17
  • 2 回答
  • 0 關(guān)注
  • 142 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號