Re: [RFC] Normalize array's "auto-increment" value on copy on write

From: Date: Sat, 29 Jun 2019 18:04:18 +0000
Subject: Re: [RFC] Normalize array's "auto-increment" value on copy on write
References: 1 2 3 4 5  Groups: php.internals 
Request: Send a blank email to internals+get-106113@lists.php.net to get a copy of this message
On Thu, 20 Jun 2019, 19:06 Rowan Collins, <rowan.collins@gmail.com> wrote: > On Thu, 20 Jun 2019 at 13:11, Wes <netmo.php@gmail.com> wrote: > > > I left that out of scope for the RFC, for reasons I don't have the > > knowledge to describe properly. In the following example, unset()+„’Èl > > J�•5ù¦ � > should > > reset the auto increment to 1 only after the third > > unset() call > > > > ``` > > $array = [0, 1, 2, 3]; // auto increment is 4 because there are "holes" > in > > the index > > unset($array[1]); // auto increment is still 4 > > unset($array[2]); // auto increment is still 4 > > unset($array[3]); // auto increment is 1, because the index sequence is > > contiguous, without holes > > ``` > > > > > I wonder if it would be possible (and sufficient) to detect if the element > being removed was the highest key, and only then look for the new "next" > value. > > The new value can be found either by decrementing the known value until you > hit an existing entry (optimal for large arrays with few gaps in the > sequence of keys) or by checking all the keys and finding the max (optimal > for small but sparse arrays like [12, 145, 65546]). > > # pseudocode: > > if ( key_being_unset == array.next_key - 1 ) { > if ( short_or_likely_to_be_sparse(array) ) { > new_highest_key = max(array.keys); > } else { > # Find highest unused number, starting from the one just deleted > do { > new_highest_key = key_being_unset - 1; > } while ( not key_exists(array, new_highest_key) ); > array.next_key = new_highest_key + 1; > } > } > > > I've no idea if this is plausible or not. > > Regards, > -- > Rowan Collins > [IMSoP] > As you state; this change is not BC. I'm not sure if I agree that this should be considered a simple bugfix. Maybe it would be good to add a secondary vote to decide if this should be implemented in PHP 7.4 or PHP 8. Arnold >

« previous php.internals (#106113) next »