Hi, I've updated my patch to allow a range of values to be passed as the third argument: pass key, pass value or pass both.
Instead of using OR-able constants, I went with an enumeration type because there are only going to be three options; it just felt wrong to have `ARRAY_FILTER_USE_KEY | ARRAY_FILTER_USE_VALUE` instead of a simpler `ARRAY_FILTER_USE_BOTH` or even just `true`. Updated examples can be found here: https://github.com/php/php-src/pull/287 Let me know if there are any major objections to the patch. On Wed, Jun 19, 2013 at 7:15 AM, Tjerk Meesters <tjerk.meest...@gmail.com>wrote: > > > On 19 Jun, 2013, at 1:04 AM, Patrick Schaaf <b...@bof.de> wrote: > > > > var_dump(array_filter(['foo', '', 'bar'], 'strlen', true)); > > > > Warning: strlen() expects exactly 1 parameter, 2 given in - on line 1 > > > > Not only do we trigger the error handler (a large enough array causes a > > performance issue), but we also get back an empty array as a result. > That's > > BC and performance loss that's simply unacceptable, so defaulting the > > behavior to pass the key is simply out of the question. > > Existing code won't pass that third, true, argument to array_filter(), and > thus will not break. > > Nevertheless, I'd say go with a new array_filter_key() function, because > that permits using existing one-parameter functions like that strlen as a > callback, instead of forcing two-parameter callback functions. > > I've mirrored the behaviour of this feature from JavaScript as much as > possible (but obviously without passing the array itself as the third > argument). As such I don't feel there's a need to introduce yet another > function just so that the key is passed as the first argument. And to use > both key and value forces the developer to use closures instead of just any > callback unless this means the second argument passed to the callback is > the array :) > > Another alternative might be to go with a third argument to > array_filter(), but make that an integer with ORable constants > ARRAY_FILTER_KEY, ARRAY_FILTER_VAL - only one of them set calls with a > single argument, both set call with two arguments. > > I see some potential here, albeit a bit more magical :) Let's see how the > discussion progresses. > > best regards > Patrick > > -- > -- > Tjerk >