[RFC] Add is_list(mixed $value): bool to check for list-like arrays
| From: | tyson andre | Date: | Sun, 20 Dec 2020 01:43:04 +0000 |
| Subject: | [RFC] Add is_list(mixed $value): bool to check for list-like arrays | ||
| Groups: | php.internals | ||
| Request: | Send a blank email to internals+get-112560@lists.php.net to get a copy of this message | ||
Hi internals,
I've created the RFC https://wiki.php.net/rfc/is_list
This adds a new function
is_list(mixed $value): bool that will return true
if the type of $value is array and the array keys are 0 .. count($value)-1 in that
order.
It's well-known that PHP's array data type is rare among programming
languages
in that it supports both integer and string keys
and that iteration order is important and guaranteed.
(it is used for overlapping use cases - in many other languages, both vectors/lists/arrays and hash
maps are available)
While it is possible to efficiently check that something is an array,
that array may still have string keys, not start from 0, have missing array offsets,
or contain out of order keys.
It can be useful to verify that the assumption that array keys are consecutive integers is correct,
both for data that is being passed into a module or for validating data before returning it from a
module.
However, because it's currently inconvenient to do that, this has rarely been done in my
experience.
In performance-sensitive serializers or data encoders, it may also be useful to have an efficient
check to distinguish lists from associative arrays.
For example, json_encode does this when deciding to serialize a value as [0, 1, 2] instead of
{“0”:0,“2”:1,“1”:1}
for arrays depending on the key orders.
Prior email threads/PRs have had others indicate interest in the ability to efficiently check
if a PHP array has sequential ordered keys starting from 0
https://externals.io/message/109760 “Any
interest in a list type?”
https://externals.io/message/111744 “Request for
couple memory optimized array improvements”
Implementation: https://github.com/php/php-src/pull/6070 (some
discussion is in the linked PR it was based on)
Thanks,
- Tyson