Re: [RFC] Add is_list(mixed $value): bool to check for list-like arrays
| From: | tyson andre | Date: | Sun, 03 Jan 2021 18:17:44 +0000 |
| Subject: | Re: [RFC] Add is_list(mixed $value): bool to check for list-like arrays | ||
| References: | 1 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-112736@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)
Due to concerns about naming causing confusion with theoretical potential future changes to the
language,
I've updated https://wiki.php.net/rfc/is_list to
use the name is_array_and_list(mixed $value): bool instead.
(e.g. what if php used the reserved word list to add an actual list type in the future,
and is_list() returned false for that.)
I plan to start voting on the RFC in a few days.
Thanks,
- Tyson