3v4l.org

run code in 300+ PHP versions simultaneously
<?php $calendar = [ 'p1' => [ ['start' => '2016-04-30 12:00', 'end' => '2016-05-01 03:00'] ], 'p2' => [ ['start' => '2016-04-30 03:00', 'end' => '2016-05-01 03:00'] ], 'p3' => [ ['start' => '2016-04-30 03:00', 'end' => '2016-04-30 13:31'], ['start' => '2016-04-30 15:26', 'end' => '2016-05-01 03:00'] ] ]; $tz = new DateTimeZone( date_default_timezone_get() ); $flat = call_user_func_array( 'array_merge', $calendar ); $min = date_create( min( array_column( $flat, 'start' ) ) )->getTimestamp()/60; $max = date_create( max( array_column( $flat, 'end' ) ) )->getTimestamp()/60; $free = gmp_sub( gmp_pow( 2, $max-$min ), gmp_pow( 2, 0 ) ); foreach( $calendar as $p ) { $pf = gmp_init( 0 ); foreach( $p as $time ) { $start = date_create( $time['start'] )->getTimestamp()/60; $end = date_create( $time['end'] )->getTimestamp()/60; $pf = gmp_or( $pf, gmp_sub( gmp_pow( 2, $end-$min ), gmp_pow( 2, $start-$min ) ) ); } $free = gmp_and( $free, $pf ); } $result = []; $start = $end = 0; while( ($start = gmp_scan1( $free, $end )) >= 0 ) { $end = gmp_scan0( $free, $start ); if( $end === False) $end = strlen( gmp_strval( $free, 2 ) )-1; $result[] = [ 'start' => date_create( '@'.($start+$min)*60 )->setTimezone( $tz )->format( 'Y-m-d H:i:s' ), 'end' => date_create( '@'.($end+$min)*60 )->setTimezone( $tz )->format( 'Y-m-d H:i:s' ) ]; } print_r( $result );
Finding entry points
Branch analysis from position: 0
2 jumps found. (Code = 77) Position 1 = 55, Position 2 = 105
Branch analysis from position: 55
2 jumps found. (Code = 78) Position 1 = 56, Position 2 = 105
Branch analysis from position: 56
2 jumps found. (Code = 77) Position 1 = 61, Position 2 = 98
Branch analysis from position: 61
2 jumps found. (Code = 78) Position 1 = 62, Position 2 = 98
Branch analysis from position: 62
1 jumps found. (Code = 42) Position 1 = 61
Branch analysis from position: 61
Branch analysis from position: 98
1 jumps found. (Code = 42) Position 1 = 55
Branch analysis from position: 55
Branch analysis from position: 98
Branch analysis from position: 105
1 jumps found. (Code = 42) Position 1 = 152
Branch analysis from position: 152
2 jumps found. (Code = 44) Position 1 = 159, Position 2 = 110
Branch analysis from position: 159
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 110
2 jumps found. (Code = 43) Position 1 = 117, Position 2 = 124
Branch analysis from position: 117
2 jumps found. (Code = 44) Position 1 = 159, Position 2 = 110
Branch analysis from position: 159
Branch analysis from position: 110
Branch analysis from position: 124
Branch analysis from position: 105
filename:       /in/kboC7
function name:  (null)
number of ops:  163
compiled vars:  !0 = $calendar, !1 = $tz, !2 = $flat, !3 = $min, !4 = $max, !5 = $free, !6 = $p, !7 = $pf, !8 = $time, !9 = $start, !10 = $end, !11 = $result
line      #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
    3     0  E >   ASSIGN                                                   !0, <array>
   17     1        NEW                                              $13     'DateTimeZone'
          2        INIT_FCALL                                               'date_default_timezone_get'
          3        DO_ICALL                                         $14     
          4        SEND_VAR_NO_REF_EX                                       $14
          5        DO_FCALL                                      0          
          6        ASSIGN                                                   !1, $13
   18     7        INIT_FCALL                                               'array_merge'
          8        SEND_ARRAY                                               !0
          9        CHECK_UNDEF_ARGS                                         
         10        DO_FCALL                                      1  $17     
         11        ASSIGN                                                   !2, $17
   19    12        INIT_FCALL                                               'date_create'
         13        INIT_FCALL                                               'min'
         14        INIT_FCALL                                               'array_column'
         15        SEND_VAR                                                 !2
         16        SEND_VAL                                                 'start'
         17        DO_ICALL                                         $19     
         18        SEND_VAR                                                 $19
         19        DO_ICALL                                         $20     
         20        SEND_VAR                                                 $20
         21        DO_ICALL                                         $21     
         22        INIT_METHOD_CALL                                         $21, 'getTimestamp'
         23        DO_FCALL                                      0  $22     
         24        DIV                                              ~23     $22, 60
         25        ASSIGN                                                   !3, ~23
   20    26        INIT_FCALL                                               'date_create'
         27        INIT_FCALL                                               'max'
         28        INIT_FCALL                                               'array_column'
         29        SEND_VAR                                                 !2
         30        SEND_VAL                                                 'end'
         31        DO_ICALL                                         $25     
         32        SEND_VAR                                                 $25
         33        DO_ICALL                                         $26     
         34        SEND_VAR                                                 $26
         35        DO_ICALL                                         $27     
         36        INIT_METHOD_CALL                                         $27, 'getTimestamp'
         37        DO_FCALL                                      0  $28     
         38        DIV                                              ~29     $28, 60
         39        ASSIGN                                                   !4, ~29
   22    40        INIT_FCALL_BY_NAME                                       'gmp_sub'
         41        INIT_FCALL_BY_NAME                                       'gmp_pow'
         42        SEND_VAL_EX                                              2
         43        SUB                                              ~31     !4, !3
         44        SEND_VAL_EX                                              ~31
         45        DO_FCALL                                      0  $32     
         46        SEND_VAR_NO_REF_EX                                       $32
         47        INIT_FCALL_BY_NAME                                       'gmp_pow'
         48        SEND_VAL_EX                                              2
         49        SEND_VAL_EX                                              0
         50        DO_FCALL                                      0  $33     
         51        SEND_VAR_NO_REF_EX                                       $33
         52        DO_FCALL                                      0  $34     
         53        ASSIGN                                                   !5, $34
   24    54      > FE_RESET_R                                       $36     !0, ->105
         55    > > FE_FETCH_R                                               $36, !6, ->105
   26    56    >   INIT_FCALL_BY_NAME                                       'gmp_init'
         57        SEND_VAL_EX                                              0
         58        DO_FCALL                                      0  $37     
         59        ASSIGN                                                   !7, $37
   27    60      > FE_RESET_R                                       $39     !6, ->98
         61    > > FE_FETCH_R                                               $39, !8, ->98
   29    62    >   INIT_FCALL                                               'date_create'
         63        FETCH_DIM_R                                      ~40     !8, 'start'
         64        SEND_VAL                                                 ~40
         65        DO_ICALL                                         $41     
         66        INIT_METHOD_CALL                                         $41, 'getTimestamp'
         67        DO_FCALL                                      0  $42     
         68        DIV                                              ~43     $42, 60
         69        ASSIGN                                                   !9, ~43
   30    70        INIT_FCALL                                               'date_create'
         71        FETCH_DIM_R                                      ~45     !8, 'end'
         72        SEND_VAL                                                 ~45
         73        DO_ICALL                                         $46     
         74        INIT_METHOD_CALL                                         $46, 'getTimestamp'
         75        DO_FCALL                                      0  $47     
         76        DIV                                              ~48     $47, 60
         77        ASSIGN                                                   !10, ~48
   31    78        INIT_FCALL_BY_NAME                                       'gmp_or'
         79        SEND_VAR_EX                                              !7
         80        INIT_FCALL_BY_NAME                                       'gmp_sub'
         81        INIT_FCALL_BY_NAME                                       'gmp_pow'
         82        SEND_VAL_EX                                              2
         83        SUB                                              ~50     !10, !3
         84        SEND_VAL_EX                                              ~50
         85        DO_FCALL                                      0  $51     
         86        SEND_VAR_NO_REF_EX                                       $51
         87        INIT_FCALL_BY_NAME                                       'gmp_pow'
         88        SEND_VAL_EX                                              2
         89        SUB                                              ~52     !9, !3
         90        SEND_VAL_EX                                              ~52
         91        DO_FCALL                                      0  $53     
         92        SEND_VAR_NO_REF_EX                                       $53
         93        DO_FCALL                                      0  $54     
         94        SEND_VAR_NO_REF_EX                                       $54
         95        DO_FCALL                                      0  $55     
         96        ASSIGN                                                   !7, $55
   27    97      > JMP                                                      ->61
         98    >   FE_FREE                                                  $39
   33    99        INIT_FCALL_BY_NAME                                       'gmp_and'
        100        SEND_VAR_EX                                              !5
        101        SEND_VAR_EX                                              !7
        102        DO_FCALL                                      0  $57     
        103        ASSIGN                                                   !5, $57
   24   104      > JMP                                                      ->55
        105    >   FE_FREE                                                  $36
   36   106        ASSIGN                                                   !11, <array>
   37   107        ASSIGN                                           ~60     !10, 0
        108        ASSIGN                                                   !9, ~60
   39   109      > JMP                                                      ->152
   41   110    >   INIT_FCALL_BY_NAME                                       'gmp_scan0'
        111        SEND_VAR_EX                                              !5
        112        SEND_VAR_EX                                              !9
        113        DO_FCALL                                      0  $62     
        114        ASSIGN                                                   !10, $62
   42   115        TYPE_CHECK                                    4          !10
        116      > JMPZ                                                     ~64, ->124
        117    >   INIT_FCALL_BY_NAME                                       'gmp_strval'
        118        SEND_VAR_EX                                              !5
        119        SEND_VAL_EX                                              2
        120        DO_FCALL                                      0  $65     
        121        STRLEN                                           ~66     $65
        122        SUB                                              ~67     ~66, 1
        123        ASSIGN                                                   !10, ~67
   45   124    >   INIT_FCALL                                               'date_create'
        125        ADD                                              ~70     !9, !3
        126        MUL                                              ~71     ~70, 60
        127        CONCAT                                           ~72     '%40', ~71
        128        SEND_VAL                                                 ~72
        129        DO_ICALL                                         $73     
        130        INIT_METHOD_CALL                                         $73, 'setTimezone'
        131        SEND_VAR_EX                                              !1
        132        DO_FCALL                                      0  $74     
        133        INIT_METHOD_CALL                                         $74, 'format'
        134        SEND_VAL_EX                                              'Y-m-d+H%3Ai%3As'
        135        DO_FCALL                                      0  $75     
        136        INIT_ARRAY                                       ~76     $75, 'start'
   46   137        INIT_FCALL                                               'date_create'
        138        ADD                                              ~77     !10, !3
        139        MUL                                              ~78     ~77, 60
        140        CONCAT                                           ~79     '%40', ~78
        141        SEND_VAL                                                 ~79
        142        DO_ICALL                                         $80     
        143        INIT_METHOD_CALL                                         $80, 'setTimezone'
        144        SEND_VAR_EX                                              !1
        145        DO_FCALL                                      0  $81     
        146        INIT_METHOD_CALL                                         $81, 'format'
        147        SEND_VAL_EX                                              'Y-m-d+H%3Ai%3As'
        148        DO_FCALL                                      0  $82     
        149        ADD_ARRAY_ELEMENT                                ~76     $82, 'end'
   43   150        ASSIGN_DIM                                               !11
   46   151        OP_DATA                                                  ~76
   39   152    >   INIT_FCALL_BY_NAME                                       'gmp_scan1'
        153        SEND_VAR_EX                                              !5
        154        SEND_VAR_EX                                              !10
        155        DO_FCALL                                      0  $83     
        156        ASSIGN                                           ~84     !9, $83
        157        IS_SMALLER_OR_EQUAL                                      0, ~84
        158      > JMPNZ                                                    ~85, ->110
   50   159    >   INIT_FCALL                                               'print_r'
        160        SEND_VAR                                                 !11
        161        DO_ICALL                                                 
        162      > RETURN                                                   1

Generated using Vulcan Logic Dumper, using php 8.0.0


preferences:
147.26 ms | 1025 KiB | 20 Q