Option for array_column() to preserve keys.
| From: | Andreas Hennings | Date: | Wed, 08 Sep 2021 00:19:18 +0000 |
| Subject: | Option for array_column() to preserve keys. | ||
| Groups: | php.internals | ||
| Request: | Send a blank email to internals+get-115998@lists.php.net to get a copy of this message | ||
Hello internals,
The function array_column() would be much more useful if there was an
option to preserve the original array keys.
I can create an RFC, but I think it is better to first discuss the options.
This is requested in different places on the web, e.g.
https://stackoverflow.com/questions/27204590/php-array-column-how-to-keep-the-keys/39298759
A workaround is proposed here and elsewhere, using array_keys() and
array_combine() to restore the keys.
However, this workaround not only adds complexity, but it breaks down
if some items don't have the value key. See https://3v4l.org/im2gZ.
A more robust workaround would be array_map(), but this is more
complex and probably slower than array_column(), for the given
purpose.
Some links for your convenience:
The function was introduced in this RFC, https://wiki.php.net/rfc/array_column
It is now documented here,
https://www.php.net/manual/en/function.array-column.php
Some ideas how this could be fixed:
1. Allow a magic value (e.g. TRUE) for the $index_key parameter, that
would cause the assoc behavior. To fully avoid BC break, this must be
a value that previously was completely forbidden. The value TRUE is
currently only forbidden with strict_types=1. A value of e.g. new
\stdClass is fully forbidden, but would be weird. A constant could be
introduced, but this would not prevent the BC concern.
2. Make the function preserve keys if $index_key === NULL. This would
be a full BC break.
3. Add an additional parameter with a boolean option or with integer
flags. This would be weird, because it would make the $index_key
parameter useless.
4. Add a new function.
Personally I would prefer option 1, with value TRUE (I can't think of
something better).
If I could change history, I would prefer option 2. The current
behavior could still be achieved with array_values(array_column(..)).
Regards,
Andreas