Hi all,
I've written a draft version of an RFC for pull request 56 (
https://github.com/php/php-src/pull/56 ), to add array_column() to the
core. Please take a look and provide feedback so that I can improve the
patch/proposal.
https://wiki.php.net/rfc/array_column
Thanks,
Ben
[PHP-INTERNALS] [DRAFT] RFC - array_column() function
| Tweet |
|
Search Discussions
-
Paul Dragoonis at Jun 21, 2012 at 8:14 pm ⇧
I like your proposal and code examples on the RFC, this function isOn Thu, Jun 21, 2012 at 8:27 PM, Ben Ramsey wrote:
Hi all,
I've written a draft version of an RFC for pull request 56 (
https://github.com/php/php-src/pull/56 ), to add array_column() to the core.
Please take a look and provide feedback so that I can improve the
patch/proposal.
https://wiki.php.net/rfc/array_column
useful and would save a foreach() to get the specified keys/indexes
out of the array.
- Paul.Thanks,
Ben
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php -
Léo Peltier at Jun 22, 2012 at 10:32 am ⇧
-
Ben Ramsey at Jun 22, 2012 at 3:52 pm ⇧
I'm open to changing or aliasing the name to array_pluck(), if othersOn 6/22/12 5:32 AM, Léo Peltier wrote:
Hi,
Shouldn't this be called 'array_pluck'?
This is the name people usually use when implementing it in PHP (see
"array_pluck(" vs "array_column(" in Google) or in other languages/libs
(see underscorejs, prototypejs and RoR).
are in agreement.
-Ben
-
Anatoliy Belsky at Jun 22, 2012 at 7:38 pm ⇧
Hi Ben,
I've tested your patch on Windows, it compiles and the tests pass. All the
best with that :)
Regards
Anatoliy
Am Fr, 22.06.2012, 17:52 schrieb Ben Ramsey:On 6/22/12 5:32 AM, Léo Peltier wrote:I'm open to changing or aliasing the name to array_pluck(), if others
Hi,
Shouldn't this be called 'array_pluck'?
This is the name people usually use when implementing it in PHP (see
"array_pluck(" vs "array_column(" in Google) or in other languages/libs
(see underscorejs, prototypejs and RoR).
are in agreement.
-Ben
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php -
Tom Sartain at Jun 22, 2012 at 8:59 pm ⇧
On Fri, Jun 22, 2012 at 11:52 AM, Ben Ramsey wrote:On 6/22/12 5:32 AM, Léo Peltier wrote:I'm open to changing or aliasing the name to array_pluck(), if others are
Hi,
Shouldn't this be called 'array_pluck'?
This is the name people usually use when implementing it in PHP (see
"array_pluck(" vs "array_column(" in Google) or in other languages/libs
(see underscorejs, prototypejs and RoR).
in agreement.
+1 on using array_pluck.
The term 'column' makes a lot of sense for PDO working with database
columns, but there is no concept of a 'column' in the array structure or
PHP as a whole, outside of database related functions.
- Tom Sartain
-
Ralph Schindler at Jun 24, 2012 at 4:19 pm ⇧
Actually, while perhaps most of the time a value from a column is whatThe term 'column' makes a lot of sense for PDO working with database
columns, but there is no concept of a 'column' in the array structure or
PHP as a whole, outside of database related functions.
people retrieving from a database result set, that is not always the
case. The result could be the value from an expression or a field from
a database view. Most database extensions outside of PDO do in fact
call it a "field", which I (too) feel is more appropriate.
In the case of this addition, I do indeed like array_pluck as well, as
column feel like an overloaded term.
-ralph
-
Morgan L. Owens at Jun 25, 2012 at 2:41 pm ⇧
While casting around for other array_* names, I remembered thatOn 2012-06-25 04:19, Ralph Schindler wrote:In the case of this addition, I do indeed like array_pluck as well, as
The term 'column' makes a lot of sense for PDO working with database
columns, but there is no concept of a 'column' in the array structure or
PHP as a whole, outside of database related functions.
column feel like an overloaded term.
array_keys() can take a second (and third) argument. With it, the
function returns all keys indexing a given value.
What we're discussing here is basically a dual to that: return all
values indexed by a given key.[*]
If the duality is continued, then what we get is
array_values(array $input[, mixed $key])
(A third $strict argument would probably do more harm than good: the key
can only be an integer or a non-numeric string, and using the same type
coercion rules would smooth out differences in the $key argument.)
[*] Yes, I know the symmetry isn't perfect, and why; the question is
whether the difference is more likely to result in "Well, duh!" or "WTF?!".
-
Ford, Mike at Jun 26, 2012 at 8:57 am ⇧
I see what you're getting at, but in my opinion the WTF factor is-----Original Message-----
From: Morgan L. Owens
Sent: 25 June 2012 15:41databaseOn 2012-06-25 04:19, Ralph Schindler wrote:
The term 'column' makes a lot of sense for PDO working withstructure orcolumns, but there is no concept of a 'column' in the arrayWhile casting around for other array_* names, I remembered thatPHP as a whole, outside of database related functions.In the case of this addition, I do indeed like array_pluck as well, as
column feel like an overloaded term.
array_keys() can take a second (and third) argument. With it, the
function returns all keys indexing a given value.
What we're discussing here is basically a dual to that: return all
values indexed by a given key.[*]
If the duality is continued, then what we get is
array_values(array $input[, mixed $key])
too high on this one -- the change from inspecting the outermost
elements to those a level down is too much to load on to a single
extra parameter in my opinion.
However, I do wonder if a related name may not be the way to go,
since it is similar in that both are extracting values from the
array -- perhaps:
array_inner_values($array, $key);
or
array_subvalues($array, $key);
Also, I wonder if there might be scope for multiple $key parameters,
to extract values from defined positions at even lower levels, so
that, for example:
array_whatever($array, 'colour', 'orange');
would return all sub-elements addressed as $array['colour']['orange'];
(Also, also: how would you see this proposal in relation to the
one for array_part(), should some version of that gain approval?)
Cheers!
Mike
--
Mike Ford,
Electronic Information Developer, Libraries and Learning Innovation,
Portland PD507, City Campus, Leeds Metropolitan University,
Portland Way, LEEDS, LS1 3HE, United Kingdom
E: m.f...@...uk T: +44 113 812 4730
To view the terms under which this email is distributed, please go to http://disclaimer.leedsmet.ac.uk/email.htm -
Scott MacVicar at Jun 22, 2012 at 9:21 pm ⇧
Hey Ben,On 22 Jun 2012, at 08:52, Ben Ramsey wrote:On 6/22/12 5:32 AM, Léo Peltier wrote:I'm open to changing or aliasing the name to array_pluck(), if others are in agreement.
Hi,
Shouldn't this be called 'array_pluck'?
This is the name people usually use when implementing it in PHP (see
"array_pluck(" vs "array_column(" in Google) or in other languages/libs
(see underscorejs, prototypejs and RoR).
We have a version of this at Facebook and its called array_pull() it has a third parameter and supports pulling a new key value too. You can find a copy of it in Phabricator. There is also mpull() which is for methods. I'd recommend combining the two methods to be honest and doing a single function that supports index names or a method.
https://github.com/facebook/libphutil/blob/master/src/utils/utils.php#L143
- S
-
Larry Garfield at Jun 23, 2012 at 5:15 am ⇧
+1 on this functionality from me. I've had to implement it inOn 06/22/2012 04:20 PM, Scott MacVicar wrote:
Hey Ben,On 22 Jun 2012, at 08:52, Ben Ramsey wrote:We have a version of this at Facebook and its called array_pull() it has a third parameter and supports pulling a new key value too. You can find a copy of it in Phabricator. There is also mpull() which is for methods. I'd recommend combining the two methods to be honest and doing a single function that supports index names or a method.On 6/22/12 5:32 AM, Léo Peltier wrote:I'm open to changing or aliasing the name to array_pluck(), if others are in agreement.
Hi,
Shouldn't this be called 'array_pluck'?
This is the name people usually use when implementing it in PHP (see
"array_pluck(" vs "array_column(" in Google) or in other languages/libs
(see underscorejs, prototypejs and RoR).
https://github.com/facebook/libphutil/blob/master/src/utils/utils.php#L143
- S
user-space way too often. :-) For the name, I'd suggest doing a survey
of other languages that PHP folks are likely to have had experience in
and going with whatever seems most common/similar to what's proposed
here, rather than debating it directly. :-)
--Larry Garfield
-
Stas Malyshev at Jun 23, 2012 at 8:43 pm ⇧
-
Matthew Weier O'Phinney at Jun 25, 2012 at 2:44 pm ⇧
Nothing whimsical about it at all, Stas. The definition is:On 2012-06-23, Stas Malyshev wrote:I wouldn't know what "pluck" means here. "Column" is a clear word with
I'm open to changing or aliasing the name to array_pluck(), if others
are in agreement.
established meaning. Let's not get too whimsical here.
Take hold of (something) and quickly remove it from its place; pick
and synonyms include "pull" and "gather".
As Ralph noted, "column" is overloaded, as it has connotations dealing
with databases as well as tables, and arrays often represent neither.
--
Matthew Weier O'Phinney
Project Lead | mat...@...com
Zend Framework | http://framework.zend.com/
PGP key: http://framework.zend.com/zf-matthew-pgp-key.asc -
Ben Ramsey at Jun 25, 2012 at 7:22 pm ⇧
I agree with Tom and Ralph that we should look at what others are doingOn 6/25/12 9:44 AM, Matthew Weier O'Phinney wrote:Nothing whimsical about it at all, Stas. The definition is:On 2012-06-23, Stas Malyshev wrote:I wouldn't know what "pluck" means here. "Column" is a clear word with
I'm open to changing or aliasing the name to array_pluck(), if others
are in agreement.
established meaning. Let's not get too whimsical here.
Take hold of (something) and quickly remove it from its place; pick
and synonyms include "pull" and "gather".
As Ralph noted, "column" is overloaded, as it has connotations dealing
with databases as well as tables, and arrays often represent neither.
and pick a similar name. After searching on "pluck," though, I'm getting
mixed results on how pluck is used:
In Rails, it looks like pluck is used for the purpose that I've created
array_column, but it's used with ActiveRecord as a way to pull a column
of results from the database (much like PDOStatement::fetchColumn). See
here:
https://github.com/rails/rails/commit/a382d60f6abc94b6a965525872f858e48abc00de
However, in Prototype.js and Underscore.js, pluck seems behave more like
array_map() in PHP:
http://api.prototypejs.org/language/Enumerable/prototype/pluck/
http://documentcloud.github.com/underscore/#pluck
Nevertheless, it would technically have the same effect as the "column"
functionality, since calling that method/property in Javascript simply
returns the value of the property or result of the method call.
Also, the Python community has recently discussed adding pluck for lists:
https://groups.google.com/forum/?fromgroups#!topic/python-ideas/p9qtUzg9zsk
It looks like they already have some functionality that implements
similar behavior, though:{'name': 'curly', 'age': 60}]stooges=[{'name': 'moe', 'age': 40}, {'name': 'larry', 'age': 50},['moe', 'larry', 'curly']names=[guy['name'] for guy in stooges]
print names
array_column/pluck in PHP would do the same:
$names = array_column($stooges, 'name');
If other languages/frameworks/libraries are using pluck to mean exactly
what this implementation means, then I agree with changing the name to
array_pluck, but if "pluck" also carries meaning similar to array_map,
then I don't want to confuse folks.
-Ben
-
Aaron Holmes at Jun 25, 2012 at 8:31 pm ⇧
For what my .02 is worth, I imagine "plucking" an item out of an array
would not occur to a user-land developer as the proper nomenclature for
extracting all the values from an array with the given key. At worst,
this means many developers simply won't learn about the function and
continue to implement it in user-land.
When array_column was offered as the name, I immediately knew what the
purpose was, before checking the RFC.On 6/25/2012 12:22 PM, Ben Ramsey wrote:On 6/25/12 9:44 AM, Matthew Weier O'Phinney wrote:I agree with Tom and Ralph that we should look at what others areNothing whimsical about it at all, Stas. The definition is:On 2012-06-23, Stas Malyshev wrote:I wouldn't know what "pluck" means here. "Column" is a clear word with
I'm open to changing or aliasing the name to array_pluck(), if others
are in agreement.
established meaning. Let's not get too whimsical here.
Take hold of (something) and quickly remove it from its place; pick
and synonyms include "pull" and "gather".
As Ralph noted, "column" is overloaded, as it has connotations dealing
with databases as well as tables, and arrays often represent neither.
doing and pick a similar name. After searching on "pluck," though, I'm
getting mixed results on how pluck is used:
In Rails, it looks like pluck is used for the purpose that I've
created array_column, but it's used with ActiveRecord as a way to pull
a column of results from the database (much like
PDOStatement::fetchColumn). See here:
https://github.com/rails/rails/commit/a382d60f6abc94b6a965525872f858e48abc00de
However, in Prototype.js and Underscore.js, pluck seems behave more
like array_map() in PHP:
http://api.prototypejs.org/language/Enumerable/prototype/pluck/
http://documentcloud.github.com/underscore/#pluck
Nevertheless, it would technically have the same effect as the
"column" functionality, since calling that method/property in
Javascript simply returns the value of the property or result of the
method call.
Also, the Python community has recently discussed adding pluck for lists:
https://groups.google.com/forum/?fromgroups#!topic/python-ideas/p9qtUzg9zsk
It looks like they already have some functionality that implements
similar behavior, though:{'name': 'curly', 'age': 60}]stooges=[{'name': 'moe', 'age': 40}, {'name': 'larry', 'age': 50},['moe', 'larry', 'curly']names=[guy['name'] for guy in stooges]
print names
array_column/pluck in PHP would do the same:
$names = array_column($stooges, 'name');
If other languages/frameworks/libraries are using pluck to mean
exactly what this implementation means, then I agree with changing the
name to array_pluck, but if "pluck" also carries meaning similar to
array_map, then I don't want to confuse folks.
-Ben -
Paul Dragoonis at Jun 26, 2012 at 12:35 am ⇧
What about array_extract ?On Mon, Jun 25, 2012 at 9:31 PM, Aaron Holmes wrote:
For what my .02 is worth, I imagine "plucking" an item out of an array
would not occur to a user-land developer as the proper nomenclature for
extracting all the values from an array with the given key. At worst, this
means many developers simply won't learn about the function and continue to
implement it in user-land.
When array_column was offered as the name, I immediately knew what the
purpose was, before checking the RFC.On 6/25/2012 12:22 PM, Ben Ramsey wrote:--On 6/25/12 9:44 AM, Matthew Weier O'Phinney wrote:I agree with Tom and Ralph that we should look at what others are doingOn 2012-06-23, Stas Malyshev wrote:Nothing whimsical about it at all, Stas. The definition is:
I'm open to changing or aliasing the name to array_pluck(), if othersare in agreement.I wouldn't know what "pluck" means here. "Column" is a clear word with
established meaning. Let's not get too whimsical here.
Take hold of (something) and quickly remove it from its place; pick
and synonyms include "pull" and "gather".
As Ralph noted, "column" is overloaded, as it has connotations dealing
with databases as well as tables, and arrays often represent neither.
and pick a similar name. After searching on "pluck," though, I'm getting
mixed results on how pluck is used:
In Rails, it looks like pluck is used for the purpose that I've created
array_column, but it's used with ActiveRecord as a way to pull a column of
results from the database (much like PDOStatement::fetchColumn). See here:
https://github.com/rails/**rails/commit/**a382d60f6abc94b6a965525872f858*
*e48abc00de<https://github.com/rails/rails/commit/a382d60f6abc94b6a965525872f858e48abc00de>
However, in Prototype.js and Underscore.js, pluck seems behave more like
array_map() in PHP:
http://api.prototypejs.org/**language/Enumerable/prototype/**pluck/<http://api.prototypejs.org/language/Enumerable/prototype/pluck/>
http://documentcloud.github.**com/underscore/#pluck<http://documentcloud.github.com/underscore/#pluck>
Nevertheless, it would technically have the same effect as the "column"
functionality, since calling that method/property in Javascript simply
returns the value of the property or result of the method call.
Also, the Python community has recently discussed adding pluck for lists:
https://groups.google.com/**forum/?fromgroups#!topic/**
python-ideas/p9qtUzg9zsk<https://groups.google.com/forum/?fromgroups#!topic/python-ideas/p9qtUzg9zsk>
It looks like they already have some functionality that implements
similar behavior, though:{'name': 'curly', 'age': 60}]stooges=[{'name': 'moe', 'age': 40}, {'name': 'larry', 'age': 50},['moe', 'larry', 'curly']names=[guy['name'] for guy in stooges]
print names
array_column/pluck in PHP would do the same:
$names = array_column($stooges, 'name');
If other languages/frameworks/libraries are using pluck to mean exactly
what this implementation means, then I agree with changing the name to
array_pluck, but if "pluck" also carries meaning similar to array_map, then
I don't want to confuse folks.
-Ben
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php -
Aaron Holmes at Jun 26, 2012 at 2:59 am ⇧
The name makes sense, but would likely be confused with extract()
http://us3.php.net/extractOn 6/25/2012 5:35 PM, Paul Dragoonis wrote:
What about array_extract ?
On Mon, Jun 25, 2012 at 9:31 PM, Aaron Holmes wrote:
For what my .02 is worth, I imagine "plucking" an item out of an
array would not occur to a user-land developer as the proper
nomenclature for extracting all the values from an array with the
given key. At worst, this means many developers simply won't learn
about the function and continue to implement it in user-land.
When array_column was offered as the name, I immediately knew what
the purpose was, before checking the RFC.
On 6/25/2012 12:22 PM, Ben Ramsey wrote:
On 6/25/12 9:44 AM, Matthew Weier O'Phinney wrote:
On 2012-06-23, Stas Malyshev wrote:
I'm open to changing or aliasing the name to
array_pluck(), if others
are in agreement.
I wouldn't know what "pluck" means here. "Column" is a
clear word with
established meaning. Let's not get too whimsical here.
Nothing whimsical about it at all, Stas. The definition is:
Take hold of (something) and quickly remove it from
its place; pick
and synonyms include "pull" and "gather".
As Ralph noted, "column" is overloaded, as it has
connotations dealing
with databases as well as tables, and arrays often
represent neither.
I agree with Tom and Ralph that we should look at what others
are doing and pick a similar name. After searching on "pluck,"
though, I'm getting mixed results on how pluck is used:
In Rails, it looks like pluck is used for the purpose that
I've created array_column, but it's used with ActiveRecord as
a way to pull a column of results from the database (much like
PDOStatement::fetchColumn). See here:
https://github.com/rails/rails/commit/a382d60f6abc94b6a965525872f858e48abc00de
However, in Prototype.js and Underscore.js, pluck seems behave
more like array_map() in PHP:
http://api.prototypejs.org/language/Enumerable/prototype/pluck/
http://documentcloud.github.com/underscore/#pluck
Nevertheless, it would technically have the same effect as the
"column" functionality, since calling that method/property in
Javascript simply returns the value of the property or result
of the method call.
Also, the Python community has recently discussed adding pluck
for lists:
https://groups.google.com/forum/?fromgroups#!topic/python-ideas/p9qtUzg9zsk
<https://groups.google.com/forum/?fromgroups#%21topic/python-ideas/p9qtUzg9zsk>
It looks like they already have some functionality that
implements similar behavior, though:'age': 50}, {'name': 'curly', 'age': 60}]stooges=[{'name': 'moe', 'age': 40}, {'name': 'larry',['moe', 'larry', 'curly']names=[guy['name'] for guy in stooges]
print names
array_column/pluck in PHP would do the same:
$names = array_column($stooges, 'name');
If other languages/frameworks/libraries are using pluck to
mean exactly what this implementation means, then I agree with
changing the name to array_pluck, but if "pluck" also carries
meaning similar to array_map, then I don't want to confuse folks.
-Ben
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php -
Morgan L. Owens at Jun 27, 2012 at 11:13 am ⇧
Remember that, in JavaScript, "foo.length" is equivalent toOn 2012-06-26 07:22, Ben Ramsey wrote:
However, in Prototype.js and Underscore.js, pluck seems behave more like
array_map() in PHP:
http://api.prototypejs.org/language/Enumerable/prototype/pluck/
http://documentcloud.github.com/underscore/#pluck
Nevertheless, it would technically have the same effect as the "column"
functionality, since calling that method/property in Javascript simply
returns the value of the property or result of the method call.
"foo['length']". The use case for map that pluck was created to cover is
basically the same one here - essentially:
function array_{column|pluck}($array, $key)
{
return array_map(function($element)use($key)
{
return $element[$key];
}, $array);
};
Or, as it's implemented in Prototype.js (which inlines the map invocation),
function pluck(property) {
var results = [];
this.each(function(value) {
results.push(value[property]);
});
return results;
}
I will say I'm not sold on "pluck" since it describes the physical
action (a sharp tug) rather than the intended result (you pluck feathers
from a chicken but you pluck fruit from a tree). Other alternatives to
array_column that have crossed my mind include:
An extra argument to array_values() analogous to the extra argument to
array_keys(): I'm worried the analogy isn't close enough to excuse the
differences.
array_project(): too mathematically esoteric
array_select(): potentially also overloaded - what next, array_join()? -
but I admit that this is the name I typically use when I write the sort
of function that I gave above.
***
One thing about the existing implementation: it doesn't retain the keys
of the original array.
This throws away information that might still be needed. It's possible
that some elements in the original array didn't supply values to the
result (they lacked have the key in question); without the original
array's keys to provide a mapping, you won't know which ones they were.
If you did this twice on different keys, then as soon as one result
array came up short, the two sets would no longer be reconcilable.
Related Discussions
Discussion Navigation
| view | thread | post |
Discussion Overview
| group | php-internals |
| categories | php |
| posted | Jun 21, '12 at 7:27p |
| active | Jun 27, '12 at 11:13a |
| posts | 18 |
| users | 13 |
| website | php.net |
