3v4l.org

run code in 500+ PHP versions simultaneously
<?php function DateSameMonth($date_iso, $add_sub_months = 1, $operator = "+") { $mdate = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; $date = new DateTime($date_iso); $d = (int)$date->format('d'); $m = (int)$date->format('m'); $y = (int)$date->format('Y'); if ($m == 2) { $mdate[$m] = (($y % 4) === 0) ? (($d <= 29) ? $d : 29) : (($d <= 28) ? $d : 28); } if($d == 1) { $mod = "first day of "; } elseif($d == $mdate[$m]) { $mod = "last day of "; } else { $mod = ""; } $date->modify($mod . $operator . $add_sub_months . ' months'); return $date->format("Y-m-d"); } var_dump(DateSameMonth("2022-01-31", 3, "-")); var_dump(DateSameMonth("2022-11-30", 3, "+")); var_dump(DateSameMonth("2022-01-31", 25, "+")); //leap year var_dump(DateSameMonth("2022-01-16", 25, "+")); echo "\n\nTEST: FIRST OF (+1 month)\n"; for($i=1; $i<=12; $i++){ $start = "2023-". $i ."-01"; echo $start . " ----> ". DateSameMonth($start, 1, "+") . "\n"; } echo "\n\nTEST: LAST OF (+12 months)\n"; for($i=1; $i<=12; $i++){ $start = date("Y-m-t", strtotime("2023-". $i ."-01")); echo $start . " ----> ". DateSameMonth($start, 12, "+") . "\n"; } echo "\n\nTEST: RANDOM DAY (+1 month)\n"; for($i=1; $i<=50; $i++){ $start = date("Y-m-") . rand(1, 27); echo $start . " ----> ". DateSameMonth($start, 1, "+") . "\n"; } echo "\n\nTEST: RANDOM DAY (-1 month)\n"; for($i=1; $i<=50; $i++){ $start = date("Y-m-") . rand(1, 27); echo $start . " ----> ". DateSameMonth($start, 1, "-") . "\n"; }
Finding entry points
Branch analysis from position: 0
1 jumps found. (Code = 42) Position 1 = 48
Branch analysis from position: 48
2 jumps found. (Code = 44) Position 1 = 50, Position 2 = 35
Branch analysis from position: 50
1 jumps found. (Code = 42) Position 1 = 73
Branch analysis from position: 73
2 jumps found. (Code = 44) Position 1 = 75, Position 2 = 53
Branch analysis from position: 75
1 jumps found. (Code = 42) Position 1 = 97
Branch analysis from position: 97
2 jumps found. (Code = 44) Position 1 = 99, Position 2 = 78
Branch analysis from position: 99
1 jumps found. (Code = 42) Position 1 = 121
Branch analysis from position: 121
2 jumps found. (Code = 44) Position 1 = 123, Position 2 = 102
Branch analysis from position: 123
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 102
2 jumps found. (Code = 44) Position 1 = 123, Position 2 = 102
Branch analysis from position: 123
Branch analysis from position: 102
Branch analysis from position: 78
2 jumps found. (Code = 44) Position 1 = 99, Position 2 = 78
Branch analysis from position: 99
Branch analysis from position: 78
Branch analysis from position: 53
2 jumps found. (Code = 44) Position 1 = 75, Position 2 = 53
Branch analysis from position: 75
Branch analysis from position: 53
Branch analysis from position: 35
2 jumps found. (Code = 44) Position 1 = 50, Position 2 = 35
Branch analysis from position: 50
Branch analysis from position: 35
filename:       /in/hmcm6
function name:  (null)
number of ops:  124
compiled vars:  !0 = $i, !1 = $start
line      #* E I O op                               fetch          ext  return  operands
-----------------------------------------------------------------------------------------
   31     0  E >   INIT_FCALL                                                   'var_dump'
          1        INIT_FCALL                                                   'datesamemonth'
          2        SEND_VAL                                                     '2022-01-31'
          3        SEND_VAL                                                     3
          4        SEND_VAL                                                     '-'
          5        DO_FCALL                                          0  $2      
          6        SEND_VAR                                                     $2
          7        DO_ICALL                                                     
   32     8        INIT_FCALL                                                   'var_dump'
          9        INIT_FCALL                                                   'datesamemonth'
         10        SEND_VAL                                                     '2022-11-30'
         11        SEND_VAL                                                     3
         12        SEND_VAL                                                     '%2B'
         13        DO_FCALL                                          0  $4      
         14        SEND_VAR                                                     $4
         15        DO_ICALL                                                     
   33    16        INIT_FCALL                                                   'var_dump'
         17        INIT_FCALL                                                   'datesamemonth'
         18        SEND_VAL                                                     '2022-01-31'
         19        SEND_VAL                                                     25
         20        SEND_VAL                                                     '%2B'
         21        DO_FCALL                                          0  $6      
         22        SEND_VAR                                                     $6
         23        DO_ICALL                                                     
   34    24        INIT_FCALL                                                   'var_dump'
         25        INIT_FCALL                                                   'datesamemonth'
         26        SEND_VAL                                                     '2022-01-16'
         27        SEND_VAL                                                     25
         28        SEND_VAL                                                     '%2B'
         29        DO_FCALL                                          0  $8      
         30        SEND_VAR                                                     $8
         31        DO_ICALL                                                     
   36    32        ECHO                                                         '%0A%0ATEST%3A+FIRST+OF+%28%2B1+month%29%0A'
   37    33        ASSIGN                                                       !0, 1
         34      > JMP                                                          ->48
   38    35    >   CONCAT                                               ~11     '2023-', !0
         36        CONCAT                                               ~12     ~11, '-01'
         37        ASSIGN                                                       !1, ~12
   39    38        CONCAT                                               ~14     !1, '+----%3E+'
         39        INIT_FCALL                                                   'datesamemonth'
         40        SEND_VAR                                                     !1
         41        SEND_VAL                                                     1
         42        SEND_VAL                                                     '%2B'
         43        DO_FCALL                                          0  $15     
         44        CONCAT                                               ~16     ~14, $15
         45        CONCAT                                               ~17     ~16, '%0A'
         46        ECHO                                                         ~17
   37    47        PRE_INC                                                      !0
         48    >   IS_SMALLER_OR_EQUAL                                          !0, 12
         49      > JMPNZ                                                        ~19, ->35
   42    50    >   ECHO                                                         '%0A%0ATEST%3A+LAST+OF+%28%2B12+months%29%0A'
   43    51        ASSIGN                                                       !0, 1
         52      > JMP                                                          ->73
   44    53    >   INIT_FCALL                                                   'date'
         54        SEND_VAL                                                     'Y-m-t'
         55        INIT_FCALL                                                   'strtotime'
         56        CONCAT                                               ~21     '2023-', !0
         57        CONCAT                                               ~22     ~21, '-01'
         58        SEND_VAL                                                     ~22
         59        DO_ICALL                                             $23     
         60        SEND_VAR                                                     $23
         61        DO_ICALL                                             $24     
         62        ASSIGN                                                       !1, $24
   45    63        CONCAT                                               ~26     !1, '+----%3E+'
         64        INIT_FCALL                                                   'datesamemonth'
         65        SEND_VAR                                                     !1
         66        SEND_VAL                                                     12
         67        SEND_VAL                                                     '%2B'
         68        DO_FCALL                                          0  $27     
         69        CONCAT                                               ~28     ~26, $27
         70        CONCAT                                               ~29     ~28, '%0A'
         71        ECHO                                                         ~29
   43    72        PRE_INC                                                      !0
         73    >   IS_SMALLER_OR_EQUAL                                          !0, 12
         74      > JMPNZ                                                        ~31, ->53
   49    75    >   ECHO                                                         '%0A%0ATEST%3A+RANDOM+DAY+%28%2B1+month%29%0A'
   50    76        ASSIGN                                                       !0, 1
         77      > JMP                                                          ->97
   51    78    >   INIT_FCALL                                                   'date'
         79        SEND_VAL                                                     'Y-m-'
         80        DO_ICALL                                             $33     
         81        INIT_FCALL                                                   'rand'
         82        SEND_VAL                                                     1
         83        SEND_VAL                                                     27
         84        DO_ICALL                                             $34     
         85        CONCAT                                               ~35     $33, $34
         86        ASSIGN                                                       !1, ~35
   52    87        CONCAT                                               ~37     !1, '+----%3E+'
         88        INIT_FCALL                                                   'datesamemonth'
         89        SEND_VAR                                                     !1
         90        SEND_VAL                                                     1
         91        SEND_VAL                                                     '%2B'
         92        DO_FCALL                                          0  $38     
         93        CONCAT                                               ~39     ~37, $38
         94        CONCAT                                               ~40     ~39, '%0A'
         95        ECHO                                                         ~40
   50    96        PRE_INC                                                      !0
         97    >   IS_SMALLER_OR_EQUAL                                          !0, 50
         98      > JMPNZ                                                        ~42, ->78
   55    99    >   ECHO                                                         '%0A%0ATEST%3A+RANDOM+DAY+%28-1+month%29%0A'
   56   100        ASSIGN                                                       !0, 1
        101      > JMP                                                          ->121
   57   102    >   INIT_FCALL                                                   'date'
        103        SEND_VAL                                                     'Y-m-'
        104        DO_ICALL                                             $44     
        105        INIT_FCALL                                                   'rand'
        106        SEND_VAL                                                     1
        107        SEND_VAL                                                     27
        108        DO_ICALL                                             $45     
        109        CONCAT                                               ~46     $44, $45
        110        ASSIGN                                                       !1, ~46
   58   111        CONCAT                                               ~48     !1, '+----%3E+'
        112        INIT_FCALL                                                   'datesamemonth'
        113        SEND_VAR                                                     !1
        114        SEND_VAL                                                     1
        115        SEND_VAL                                                     '-'
        116        DO_FCALL                                          0  $49     
        117        CONCAT                                               ~50     ~48, $49
        118        CONCAT                                               ~51     ~50, '%0A'
        119        ECHO                                                         ~51
   56   120        PRE_INC                                                      !0
        121    >   IS_SMALLER_OR_EQUAL                                          !0, 50
        122      > JMPNZ                                                        ~53, ->102
   59   123    > > RETURN                                                       1

Function datesamemonth:
Finding entry points
Branch analysis from position: 0
2 jumps found. (Code = 43) Position 1 = 25, Position 2 = 43
Branch analysis from position: 25
2 jumps found. (Code = 43) Position 1 = 28, Position 2 = 35
Branch analysis from position: 28
2 jumps found. (Code = 43) Position 1 = 30, Position 2 = 32
Branch analysis from position: 30
1 jumps found. (Code = 42) Position 1 = 33
Branch analysis from position: 33
1 jumps found. (Code = 42) Position 1 = 41
Branch analysis from position: 41
2 jumps found. (Code = 43) Position 1 = 45, Position 2 = 47
Branch analysis from position: 45
1 jumps found. (Code = 42) Position 1 = 53
Branch analysis from position: 53
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 47
2 jumps found. (Code = 43) Position 1 = 50, Position 2 = 52
Branch analysis from position: 50
1 jumps found. (Code = 42) Position 1 = 53
Branch analysis from position: 53
Branch analysis from position: 52
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 32
1 jumps found. (Code = 42) Position 1 = 41
Branch analysis from position: 41
Branch analysis from position: 35
2 jumps found. (Code = 43) Position 1 = 37, Position 2 = 39
Branch analysis from position: 37
1 jumps found. (Code = 42) Position 1 = 40
Branch analysis from position: 40
2 jumps found. (Code = 43) Position 1 = 45, Position 2 = 47
Branch analysis from position: 45
Branch analysis from position: 47
Branch analysis from position: 39
2 jumps found. (Code = 43) Position 1 = 45, Position 2 = 47
Branch analysis from position: 45
Branch analysis from position: 47
Branch analysis from position: 43
filename:       /in/hmcm6
function name:  DateSameMonth
number of ops:  64
compiled vars:  !0 = $date_iso, !1 = $add_sub_months, !2 = $operator, !3 = $mdate, !4 = $date, !5 = $d, !6 = $m, !7 = $y, !8 = $mod
line      #* E I O op                               fetch          ext  return  operands
-----------------------------------------------------------------------------------------
    3     0  E >   RECV                                                 !0      
          1        RECV_INIT                                            !1      1
          2        RECV_INIT                                            !2      '%2B'
    4     3        ASSIGN                                                       !3, <array>
    6     4        NEW                                                  $10     'DateTime'
          5        SEND_VAR_EX                                                  !0
          6        DO_FCALL                                          0          
          7        ASSIGN                                                       !4, $10
    7     8        INIT_METHOD_CALL                                             !4, 'format'
          9        SEND_VAL_EX                                                  'd'
         10        DO_FCALL                                          0  $13     
         11        CAST                                              4  ~14     $13
         12        ASSIGN                                                       !5, ~14
    8    13        INIT_METHOD_CALL                                             !4, 'format'
         14        SEND_VAL_EX                                                  'm'
         15        DO_FCALL                                          0  $16     
         16        CAST                                              4  ~17     $16
         17        ASSIGN                                                       !6, ~17
    9    18        INIT_METHOD_CALL                                             !4, 'format'
         19        SEND_VAL_EX                                                  'Y'
         20        DO_FCALL                                          0  $19     
         21        CAST                                              4  ~20     $19
         22        ASSIGN                                                       !7, ~20
   11    23        IS_EQUAL                                                     !6, 2
         24      > JMPZ                                                         ~22, ->43
   12    25    >   MOD                                                  ~24     !7, 4
         26        IS_IDENTICAL                                                 ~24, 0
         27      > JMPZ                                                         ~25, ->35
         28    >   IS_SMALLER_OR_EQUAL                                          !5, 29
         29      > JMPZ                                                         ~26, ->32
         30    >   QM_ASSIGN                                            ~27     !5
         31      > JMP                                                          ->33
         32    >   QM_ASSIGN                                            ~27     29
         33    >   QM_ASSIGN                                            ~28     ~27
         34      > JMP                                                          ->41
         35    >   IS_SMALLER_OR_EQUAL                                          !5, 28
         36      > JMPZ                                                         ~29, ->39
         37    >   QM_ASSIGN                                            ~30     !5
         38      > JMP                                                          ->40
         39    >   QM_ASSIGN                                            ~30     28
         40    >   QM_ASSIGN                                            ~28     ~30
         41    >   ASSIGN_DIM                                                   !3, !6
         42        OP_DATA                                                      ~28
   15    43    >   IS_EQUAL                                                     !5, 1
         44      > JMPZ                                                         ~31, ->47
   16    45    >   ASSIGN                                                       !8, 'first+day+of+'
   15    46      > JMP                                                          ->53
   18    47    >   FETCH_DIM_R                                          ~33     !3, !6
         48        IS_EQUAL                                                     !5, ~33
         49      > JMPZ                                                         ~34, ->52
   19    50    >   ASSIGN                                                       !8, 'last+day+of+'
   18    51      > JMP                                                          ->53
   22    52    >   ASSIGN                                                       !8, ''
   25    53    >   INIT_METHOD_CALL                                             !4, 'modify'
         54        CONCAT                                               ~37     !8, !2
         55        CONCAT                                               ~38     ~37, !1
         56        CONCAT                                               ~39     ~38, '+months'
         57        SEND_VAL_EX                                                  ~39
         58        DO_FCALL                                          0          
   28    59        INIT_METHOD_CALL                                             !4, 'format'
         60        SEND_VAL_EX                                                  'Y-m-d'
         61        DO_FCALL                                          0  $41     
         62      > RETURN                                                       $41
   29    63*     > RETURN                                                       null

End of function datesamemonth

Generated using Vulcan Logic Dumper, using php 8.5.0


preferences:
171.36 ms | 1538 KiB | 25 Q