Return first key of associative array in PHP

2019-01-21 12:58发布

问题:

I'm trying to obtain the first key of an associative array, without creating a temporary variable via array_keys() or the like, to pass by reference. Unfortunately both reset() and array_shift() take the array argument by reference, so neither seem to be viable results.

With PHP 5.4 I'll be in heaven; array_keys($array)[0];, but unfortunately this of course is not an option either.

I could create a function to serve the purpose, but I can only imagine there is some concoction of PHP's array_* functions that will produce the desired result in a single statement, that I cannot think of or come up with.

So:

$array = array('foo' => 'bar', 'hello' => 'world');

$firstKey = assorted_functions($array); // $firstKey = 'foo'

The reason for the "no reference" clause in my question is only for the fact that I assume array_keys() will be required (if there is a way passing by reference, please fire away)

I'd use key(), but that requires a reset() as I'm not sure where the pointer will be at the time of this operation.


Addendum

I'm following up on a realization I had recently: as I mentioned in the comments, it'll use the memory all the same, so if that's a concern, this question hath no solution.

$a = range(0,99999);
var_dump(memory_get_peak_usage()); // int(8644416)
$k = array_keys($a)[0];
var_dump(memory_get_peak_usage()); // int(17168824)

I knew this, as PHP doesn't have such optimization capabilities, but figured it warranted explicit mention.

The brevity of the accepted answer is nice though, and'll work if you're working with reasonably sized arrays.

回答1:

Although array_shift(array_keys($array)); will work, current(array_keys($array)); is faster as it doesn't advance the internal pointer.

Either one will work though.

Update

As @TomcatExodus noted, array_shift(); expects an array passed by reference, so the first example will issue an error. Best to stick with current();



回答2:

You can use reset and key:

reset( $array );
$first_key = key( $array );

or, you can use a function:

function firstIndex($a) { foreach ($a as $k => $v) return $k; }
$key = firstIndex( $array );


回答3:

array_shift(array_keys($array))


回答4:

each() still a temporary required, but potentially a much smaller overhead than using array_keys().



回答5:

What about using array_slice (in combination with array_keys for associative arrays)?

$a = range(0,999999);
var_dump(memory_get_peak_usage());
$k = array_keys(array_slice($a, 0, 1, TRUE))[0];
var_dump(memory_get_peak_usage());
var_dump($k);
$k = array_keys($a)[0];
var_dump(memory_get_peak_usage());

Gives as output (at least with me):

int(36354360)
int(36355112)
int(0)
int(72006024)
int(0)