Bug #81651 [Opn->Nab]: In a for loop using dates, a date modify also updates the initial variable

From: Date: Tue, 23 Nov 2021 06:15:45 +0000
Subject: Bug #81651 [Opn->Nab]: In a for loop using dates, a date modify also updates the initial variable
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-237929@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=81651&edit=1 ID: 81651 Updated by: requinix@php.net Reported by: cliffie dot baker at gmail dot com Summary: In a for loop using dates, a date modify also updates the initial variable -Status: Open +Status: Not a bug Type: Bug Package: Date/time related Operating System: Windows 10 PHP Version: 7.4.26 Block user comment: N Private report: N New Comment: There's a pretty big difference between the number 5 and an instance of the DateTime object. For example, one is a number and the other is an object. $date1 and $start_date are going to be the same object because that is how objects work in PHP: assignment does not create copies. If you want $date1 and $start_date to be two different objects then they need to be two different objects. You can do that by cloning $start_date into $date1. https://www.php.net/manual/en/language.oop5.cloning.php But don't do that here. Instead of a for loop and DateTime::modify, use a foreach loop and DatePeriod. https://www.php.net/manual/en/class.dateperiod.php Previous Comments: ------------------------------------------------------------------------ [2021-11-23 05:14:06] cliffie dot baker at gmail dot com Description: ------------ Using a for loop to generate a range of dates and using the date modify to do the increment, the initial variable used for the start date is also being updated. I don't think this is the correct behaviour and certainly isn't consistent with a simple for loop. Must admit I haven't tested in PHP 7.4.26 but have in 7.4.25 Tested using the 7.4.25 version of Xampp environment and also the 'try it' feature of the w3schools Test script: --------------- $start_date = new datetime('first Monday of January 2022'); $end_date = new datetime('last Monday of January 2022'); for ($date1 = $start_date; $date1 <= $end_date; $date1->modify('+1 week')) { echo $date1->format('Y-m-d').'<br>'; } echo 'Start date '. $start_date->format ('Y-m-d'); Gives 2022-01-03 2022-01-10 2022-01-17 2022-01-24 2022-01-31 Start date 2022-02-07 The original start date of 2022-01-03 has been updated to 2022-02-07 through the loop Compare this to a simple for loop $start = 5; for ($x = $start; $x <= 10; $x++) { echo "The number is: $x <br>"; } echo 'start '.$start; ?> Gives The number is: 5 The number is: 6 The number is: 7 The number is: 8 The number is: 9 The number is: 10 start 5 This is as expected Expected result: ---------------- Should be - For a for loop with date modify Start 2022-01-03 (the original value) Actual result: -------------- Actual For a for loop with date modify Start date 2022-02-07 (the updated value at the end of the loop) ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=81651&edit=1

« previous php.bugs (#237929) next »