====== PHP RFC: Arrays starting with a negative index ====== * Version: 0.4 * Date: 2017-04-20 * Author: Pedro Magalhães, pmmaga@php.net * Status: Implemented * First Published at: http://wiki.php.net/rfc/negative_array_index ===== Introduction ===== On the documentation for ''[[http://php.net/manual/en/function.array-fill.php|array_fill]]'' the ''start_index'' description mentions: "If ''start_index'' is negative, the first index of the returned array will be ''start_index'' and the following indices will start from zero." This is consistent everywhere when an explicit negative key is used and implicit keys are used afterwards. ===== Proposal ===== In other words, any array that has a number ''n'' as it's first numeric key will have for it's next implicit key either ''n+1'' if ''n >= 0'' or ''0'' if ''n < 0''. This RFC proposes to make this consistent by always using ''n+1'' regardless of the sign of ''n''. As also mentioned on the relevant part of the [[http://php.net/manual/en/language.types.array.php|arrays documentation]]: > if no key is specified, the maximum of the existing integer indices is taken, and the new key will be that maximum value plus 1 (but at least 0). This RFC proposes to eliminate the parenthesis part of that sentence. Which is an exception to a rule, that people have to learn one way or the other. This proposal targets 8.0. However, to ease the transition and find places where this may become an issue, there is a secondary vote for emitting a deprecation notice in cases where the behavior will change. All the variables in this code: true, true, true]; $c = ["string" => true, -2 => true, true, true]; unset($c["string"]); $d[-2] = true; $d[] = true; $d[] = true; Result in the array: array(3) { [-2]=> bool(true) [0]=> bool(true) [1]=> bool(true) }
NOTE: If accepted, during the deprecation phase the following ''E_DEPRECATED'' notice would be emitted in cases where the behavior will change: Deprecated: In the next major version of PHP the implicit keys of this array will start from -1 instead of 0 in ...
With the implementation of this RFC, they will all result in: array(3) { [-2]=> bool(true) [-1]=> bool(true) [0]=> bool(true) } ===== Backward Incompatible Changes ===== Code that relies on the current behavior to access array elements with an explicit key after that array has been started with a negative index and used implicit keys afterwards will change it's behavior. Example: Will no longer output ''Accessing key 1 explicitly''.
NOTE: If accepted, during the deprecation phase the ''E_DEPRECATED'' notice mentioned in the previous section would be emitted.
===== Proposed PHP Version(s) ===== PHP 8.0 (Deprecation notice for 7.3) ===== Unaffected PHP Functionality ===== Arrays with explicit keys, string keys, or an initial numeric index ''>= -1'' are not affected. This also means that arrays that never use explicit keys will still start with ''0''. Furthermore, iterating over arrays without explicit keys (ie. ''foreach'') is not affected. ===== Voting Choices ===== Both votes require a 2/3 majority. * Yes * No ---- * Yes * No
The previous vote targeting 7.2 was closed with 14 for and 16 against
===== Patches and Tests ===== This RFC is implemented by the following patches: - Implementation: https://github.com/php/php-src/pull/2383 - Documentation: //WIP// ===== References ===== Version 0.3: Discussion on the mailing list: https://externals.io/message/98302 First proposal Voting period discussion: https://externals.io/message/99412 Second proposal Voting period discussion: https://externals.io/message/99511 ---- Version 0.4: Discussion on the mailing list: https://externals.io/message/101861