Hi Andrea,

> On Jan 4, 2016, at 12:05, Andrea Faulds <a...@ajf.me> wrote:
> 
> Hi John,
> 
> John Bafford wrote:
>> Happy New Year, everyone!
>> 
>> I’d like to present the first new PHP RFC for this year, a proposal to add 
>> functions to easily get the first, last, or an arbitrary key (and value) by 
>> index from an array, taking advantage of PHP’s property that arrays are 
>> ordered maps.
>> 
>> RFC: https://wiki.php.net/rfc/array_key_first_last_index
>> PR: https://github.com/php/php-src/pull/347
> 
> How often would such functions be useful? Perhaps they fill a gap, but I'm 
> not sure if it's one that needs filling. array_key_first and array_key_last 
> can already be accomplished in two or so lines of code (four if you make a 
> function), and array_key_index can be implemented in a few lines with a 
> foreach() loop and a counter.

array_key_first() and array_key_last() can’t be implemented in userspace and 
maintain all three of fast, immutable, and doesn’t-look-weird.

The best you could do for array_key_first() is:

function array_key_first($arr) {
        foreach($arr as $k => $v)
                return $k;
        
        return null;
}

Which already looks kind of weird. For array_key_last, your best bet is

function array_key_last($arr) {
        $k = null;      
        foreach($arr as $k => $v)
                ;
        //Rely on the fall-through of $k from the last iteration
        return $k;
}

which looks even weirder

or 

function array_key_last($arr) {
        $keys = array_keys($arr);
        if($cnt = count($keys))
                return $keys[$cnt - 1];
        
        return null;
}

Which adds the overhead of array_keys() iterating over the array and 
duplicating *all* of the array’s keys just to retrieve one.

Any solution that uses reset() + key() or end() + key() mutates the array, 
which means duplicating it if you pass it into a function. This takes a 
non-trivial time if you have a large array.


> array_key_first and array_key_last seem mostly harmless, at least. I'm not 
> sure the same can be said for array_key_index, since it has O(n) complexity. 
> I worry that it might end up used by people who think it is more efficient 
> than iterating through an array, even though it is not. I would rather we not 
> include this specific function, and avoid potentially disguising the time 
> complexity of key lookup, especially as I can't think of a good use-case for 
> it. As for array_key_first and array_key_last, well, maybe they're useful, I 
> have no strong opinion on them. They might be handy to get the first and last 
> key of an array without moving the internal pointer, so who knows, maybe we 
> should add them.

I’ll admit that array_key_index() could be easily abused. If you need to use it 
more than a few times on a particular array, unless you’ve got a huge array and 
need to keep memory use constrained, you’re probably better off just calling 
array_keys() and using an index into the result. This would need to be included 
in the documentation as a use case caveat, though it wouldn’t be surprising if 
people ignored the warning and used it incorrectly anyway.

The reason array_key_index() is included in the RFC is because it kind of fell 
out of the original implementation and since it’s kind of useful, for a limited 
set of problems, I kept it in. It’s really more of a special-case tool with 
(very) limited general use, but it is a substantial improvement over the 
alternatives if you really do it need.

My primary goal with this RFC is array_key_first() and array_key_last(), so I 
would not be against having array_key_index() be a separate voting choice, if 
that would make people more comfortable.


> Thanks.
> -- 
> Andrea Faulds
> https://ajf.me/


-John


--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to