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
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php