Req #73735 [Com]: array_column keys should be preserved
| From: | php at yopmail dot com | Date: | Thu, 18 Feb 2021 17:27:05 +0000 |
| Subject: | Req #73735 [Com]: array_column keys should be preserved | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-232267@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=73735&edit=1
ID: 73735
Comment by: php at yopmail dot com
Reported by: photon0 at gmail dot com
Summary: array_column keys should be preserved
Status: Open
Type: Feature/Change Request
Package: Arrays related
Operating System: ANY
PHP Version: Next Minor Version
Block user comment: N
Private report: N
New Comment:
I guess you even meant:
Expected result:
----------------
array(4) { [1]=> int(1) [2]=> int(4) [3]=> int(9) ["four"]=> int(16) }
(i.e. keep all keys, even numeric)
and I agree with you! (and a quick Web search shows we're not alone...)
---
@requinix: I see at least 2 ways:
1. Add a
bool $preserve_keys = false parameter (like array_slice)
that would at least enable us to use
array_column($items, "id", null, true)
2. Change the default behavior (consistent with array_map)
and just use
array_values(array_column($items, "id"))
if you really want to lose the keys
PS: see also Request #66435
Previous Comments:
------------------------------------------------------------------------
[2016-12-14 15:30:55] photon0 at gmail dot com
I always saw PHP's arrays as a Swiss army knife for data manipulation. If you say this would be
difficult to implement or would result in less than optimal performance I refer entirely to your
judgment.
The only disadvantage I see to the workaround is the performance. Calling 3 functions is clearly
slower than using just one.
That said, your point is valid and this request was just a suggestion.
------------------------------------------------------------------------
[2016-12-14 03:23:59] requinix@php.net
As default behavior it makes sense, but it should be possible to explicitly invoke the behavior
using arguments and I'm not sure how the change could be squeezed into the function. NULL as
the $index_key?
Anyway, the workaround is trivial:
array_combine(array_keys($items), array_column($items, "id"))
------------------------------------------------------------------------
[2016-12-13 21:27:05] photon0 at gmail dot com
Description:
------------
It would increase the usability of this function if it could preserve the array's keys in the
result.
I was expecting this to be the default behaviour.
best regards,
David Lévêsque
Test script:
---------------
$items = array(
1 => ["id" => 1],
2 => ["id" => 4],
3 => ["id" => 9],
"four" => ["id" => 16]
);
var_dump(array_column($items,"id"));
Expected result:
----------------
array(4) { [0]=> int(1) [1]=> int(4) [2]=> int(9) ["four"]=> int(16) }
Actual result:
--------------
array(4) { [0]=> int(1) [1]=> int(4) [2]=> int(9) [3]=> int(16) }
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=73735&edit=1