Advertisement
nikola-r-hristov

Carbon Calculate hours in an interval from a period

Nov 16th, 2018
717
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 2.60 KB | None | 0 0
  1. <?php
  2.  
  3. use Carbon\Carbon;
  4. use Carbon\CarbonPeriod;
  5. use Carbon\CarbonInterval;
  6.  
  7. class PeriodInterval {
  8.     public function hoursIn() {
  9.         /**
  10.         * Time Periods
  11.         */
  12.         $periods = [
  13.             'day' => [
  14.                 '08:00:00',
  15.                 '18:00:00'
  16.             ],
  17.             'night' => [
  18.                 '18:00:00',
  19.                 '08:00:00'
  20.             ],
  21.             'lunch' => [
  22.                 '11:00:00',
  23.                 '14:00:00'
  24.             ]
  25.         ];
  26.        
  27.         /**
  28.         * Time Intervals
  29.         */
  30.         $intervals = [
  31.             'parking' => [
  32.                 'John Doe' => [
  33.                     Carbon::createFromFormat('Y-m-d H:i:s', '2018-12-10 07:00:00'),
  34.                     Carbon::createFromFormat('Y-m-d H:i:s', '2018-12-10 09:00:00')
  35.                 ],
  36.                 'Jane Doe' => [
  37.                     Carbon::createFromFormat('Y-m-d H:i:s', '2018-12-10 08:00:00'),
  38.                     Carbon::createFromFormat('Y-m-d H:i:s', '2018-12-10 09:00:00')
  39.                 ],
  40.                 'John Hope' => [
  41.                     Carbon::createFromFormat('Y-m-d H:i:s', '2018-12-10 11:00:00'),
  42.                     Carbon::createFromFormat('Y-m-d H:i:s', '2018-12-10 13:00:00')
  43.                 ],
  44.                 'Jane Hope' => [
  45.                     Carbon::createFromFormat('Y-m-d H:i:s', '2018-12-10 18:00:00'),
  46.                     Carbon::createFromFormat('Y-m-d H:i:s', '2018-12-10 19:00:00')
  47.                 ]
  48.             ]
  49.         ];
  50.        
  51.         /**
  52.         * Hours for Interval in Period
  53.         */
  54.         function hoursForIntervalInPeriod(array $period, array $interval) {
  55.             $Period = new CarbonPeriod(array_shift($interval)->toDateTimeString(), '1 hour', array_pop($interval)->toDateTimeString());
  56.            
  57.             return $Period->filter(function($date) use ($period) {
  58.                 $period_starts = Carbon::createFromFormat('Y-m-d H:i:s', $date->format('Y-m-d') . ' ' . array_shift($period));
  59.                 $period_ends = Carbon::createFromFormat('Y-m-d H:i:s', $date->format('Y-m-d') . ' ' . array_pop($period));
  60.                
  61.                 // Normal Period
  62.                 if ($period_starts < $period_ends) {
  63.                     return ($date >= $period_starts && $date < $period_ends);
  64.                 }
  65.                
  66.                 // Inverted Period (Overnight)
  67.                 if ($period_starts > $period_ends) {
  68.                     return ($date >= $period_starts || $date < $period_ends);
  69.                 }
  70.                
  71.                 return false;
  72.             })->count();
  73.         }
  74.        
  75.         /**
  76.         * Map Everything
  77.         */
  78.         $hours = array_map(function($interval, $interval_key) use ($periods) {
  79.             return array_map(function ($period, $period_key) use ($interval, $interval_key) {
  80.                 return [ $interval_key . ucfirst($period_key) => array_map(function($interval_item, $interval_item_key) use ($period) {
  81.                     /**
  82.                     * Calculate Total Hours
  83.                     */
  84.                     $total_hours = hoursForIntervalInPeriod($period, $interval_item);
  85.                    
  86.                     return [ $interval_item_key => $total_hours ];
  87.                 }, $interval, array_keys($interval)) ];
  88.             }, $periods, array_keys($periods));
  89.         }, $intervals, array_keys($intervals));
  90.        
  91.         return $hours;
  92.     }
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement