Get first key in a (possibly) associative array?

PhpArrays

Php Problem Overview


What's the best way to determine the first key in a possibly associative array? My first thought it to just foreach the array and then immediately breaking it, like this:

foreach ($an_array as $key => $val) break;

Thus having $key contain the first key, but this seems inefficient. Does anyone have a better solution?

Php Solutions


Solution 1 - Php

2019 Update

Starting from PHP 7.3, there is a new built in function called array_key_first() which will retrieve the first key from the given array without resetting the internal pointer. Check out the documentation for more info.


You can use reset and key:

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

It's essentially the same as your initial code, but with a little less overhead, and it's more obvious what is happening.

Just remember to call reset, or you may get any of the keys in the array. You can also use end instead of reset to get the last key.

If you wanted the key to get the first value, reset actually returns it:

$first_value = reset($array);

There is one special case to watch out for though (so check the length of the array first):

$arr1 = array(false);
$arr2 = array();
var_dump(reset($arr1) === reset($arr2)); // bool(true)

Solution 2 - Php

array_keys returns an array of keys. Take the first entry. Alternatively, you could call reset on the array, and subsequently key. The latter approach is probably slightly faster (Thoug I didn't test it), but it has the side effect of resetting the internal pointer.

Solution 3 - Php

Interestingly enough, the foreach loop is actually the most efficient way of doing this.

Since the OP specifically asked about efficiency, it should be pointed out that all the current answers are in fact much less efficient than a foreach.

I did a benchmark on this with php 5.4, and the reset/key pointer method (accepted answer) seems to be about 7 times slower than a foreach. Other approaches manipulating the entire array (array_keys, array_flip) are obviously even slower than that and become much worse when working with a large array.

Foreach is not inefficient at all, feel free to use it!

Edit 2015-03-03:

Benchmark scripts have been requested, I don't have the original ones but made some new tests instead. This time I found the foreach only about twice as fast as reset/key. I used a 100-key array and ran each method a million times to get some noticeable difference, here's code of the simple benchmark:

$array = [];
for($i=0; $i < 100; $i++)
    $array["key$i"] = $i;

for($i=0, $start = microtime(true); $i < 1000000; $i++) {
    foreach ($array as $firstKey => $firstValue) {
        break;
    }
}
echo "foreach to get first key and value: " . (microtime(true) - $start) . " seconds <br />";

for($i=0, $start = microtime(true); $i < 1000000; $i++) {
    $firstValue = reset($array);
    $firstKey = key($array);
}
echo "reset+key to get first key and value: " . (microtime(true) - $start) . " seconds <br />";

for($i=0, $start = microtime(true); $i < 1000000; $i++) {
    reset($array);
    $firstKey = key($array);
}
echo "reset+key to get first key: " . (microtime(true) - $start) . " seconds <br />";


for($i=0, $start = microtime(true); $i < 1000000; $i++) {
    $firstKey = array_keys($array)[0];
}
echo "array_keys to get first key: " . (microtime(true) - $start) . " seconds <br />";

On my php 5.5 this outputs:

foreach to get first key and value: 0.15501809120178 seconds 
reset+key to get first key and value: 0.29375791549683 seconds 
reset+key to get first key: 0.26421809196472 seconds 
array_keys to get first key: 10.059751987457 seconds

reset+key http://3v4l.org/b4DrN/perf#tabs
foreach http://3v4l.org/gRoGD/perf#tabs

Solution 4 - Php

key($an_array) will give you the first key

edit per Blixt: you should call reset($array); before key($an_array) to reset the pointer to the beginning of the array.

Solution 5 - Php

You could try

array_keys($data)[0]

Solution 6 - Php

For 2018+

Starting with PHP 7.3, there is an array_key_first() function that achieve exactly this:

$array = ['foo' => 'lorem', 'bar' => 'ipsum'];
$firstKey = array_key_first($array); // 'foo'

Documentation is available here. 

Solution 7 - Php

list($firstKey) = array_keys($yourArray);

Solution 8 - Php

If efficiency is not that important for you, you can use array_keys($yourArray)[0] in PHP 5.4 (and higher).

Examples:

# 1
$arr = ["my" => "test", "is" => "best"];    
echo array_keys($arr)[0] . "\r\n"; // prints "my"


# 2
$arr = ["test", "best"];
echo array_keys($arr)[0] . "\r\n"; // prints "0"

# 3
$arr = [1 => "test", 2 => "best"];
echo array_keys($arr)[0] . "\r\n"; // prints "1"

The advantage over solution:

list($firstKey) = array_keys($yourArray);

is that you can pass array_keys($arr)[0] as a function parameter (i.e. doSomething(array_keys($arr)[0], $otherParameter)).

HTH

Solution 9 - Php

Please find the following:

$yourArray = array('first_key'=> 'First', 2, 3, 4, 5);
$keys	=	array_keys($yourArray);
echo "Key = ".$keys[0];

Working Example:

Solution 10 - Php

$myArray = array(
	2 => '3th element',
	4 => 'first element',
	1 => 'second element',
	3 => '4th element'
);
echo min(array_keys($myArray)); // return 1

Solution 11 - Php

This could also be a solution:

$yourArray = array('first_key'=> 'First', 2, 3, 4, 5);
$first_key = current(array_flip($yourArray));
echo $first_key;

I have tested it and it works.

Working Code.

Solution 12 - Php

To enhance on the solution of Webmut, I've added the following solution:

$firstKey = array_keys(array_slice($array, 0, 1, TRUE))[0];

The output for me on PHP 7.1 is:

foreach to get first key and value: 0.048566102981567 seconds 
reset+key to get first key and value: 0.11727809906006 seconds 
reset+key to get first key: 0.11707186698914 seconds 
array_keys to get first key: 0.53917098045349 seconds 
array_slice to get first key: 0.2494580745697 seconds 

If I do this for an array of size 10000, then the results become

foreach to get first key and value: 0.048488140106201 seconds 
reset+key to get first key and value: 0.12659382820129 seconds 
reset+key to get first key: 0.12248802185059 seconds 
array_slice to get first key: 0.25442600250244 seconds 

The array_keys method times out at 30 seconds (with only 1000 elements, the timing for the rest was about the same, but the array_keys method had about 7.5 seconds).

Solution 13 - Php

 $arr = array('key1'=>'value1','key2'=>'value2','key3'=>'key3');
 list($first_key) = each($arr);
 print $first_key;
 // key1

Solution 14 - Php

This is the easier way I had ever found. Fast and only two lines of code :-D

$keys = array_keys($array);
echo $array[$keys[0]];

Solution 15 - Php

The best way that worked for me was

array_shift(array_keys($array))

array_keys gets array of keys from initial array and then array_shift cuts from it first element value. You will need PHP 5.4+ for this.

Solution 16 - Php

php73:

$array = ['a' => '..', 'b' => '..'];

array_key_first($array); // 'a'
array_key_last($array); // 'b';

http://php.net/manual/en/function.array-key-first.php

Solution 17 - Php

Since PHP 7.3.0 function array_key_first() can be used.

There are several ways to provide this functionality for versions prior to PHP 7.3.0. It is possible to use array_keys(), but that may be rather inefficient. It is also possible to use reset() and key(), but that may change the internal array pointer. An efficient solution, which does not change the internal array pointer, written as polyfill:

<?php
if (!function_exists('array_key_first')) {
    function array_key_first(array $arr) {
        foreach($arr as $key => $unused) {
            return $key;
        }

        return null;
    }
}
?>

Solution 18 - Php

Re the @Blixt answer, prior to 7.3.0, this polyfill can be used:

if (!function_exists('array_key_first')) {
  function array_key_first(array $array) {
    return key(array_slice($array, 0, 1, true));
  }
}

Solution 19 - Php

This will work on all PHP versions

$firstKey = '' ;

//$contact7formlist - associative array. 

if(function_exists('array_key_first')){
	
	$firstKey = array_key_first($contact7formlist);
	
}else{
	
	foreach ($contact7formlist as $key => $contact7form ){
		$firstKey = $key;
		break;
	}
}

Solution 20 - Php

A one-liner:

$array = array('key1'=>'value1','key2'=>'value2','key3'=>'key3');
echo key( array_slice( $array, 0, 1, true ) );

# echos 'key1'

Solution 21 - Php

Today I had to search for the first key of my array returned by a POST request. (And note the number for a form id etc)

Well, I've found this: https://stackoverflow.com/questions/6698428/return-first-key-of-associative-array-in-php

http://php.net/key

I've done this, and it work.

    $data = $request->request->all();
    dump($data);
    while ($test = current($data)) {
        dump($test);
        echo key($data).'<br />';die();
        break;
    }

Maybe it will eco 15min of an other guy. CYA.

Solution 22 - Php

I think the best and fastest way to do it is:

$first_key=key(array_slice($array, 0, 1, TRUE))

Solution 23 - Php

array_chunk split an array into chunks, you can use:

$arr = ['uno'=>'one','due'=>'two','tre'=>'three'];
$firstElement = array_chunk($arr,1,true)[0];
var_dump($firstElement);

Solution 24 - Php

You can play with your array

$daysArray = array('Monday', 'Tuesday', 'Sunday');
$day = current($transport); // $day = 'Monday';
$day = next($transport);    // $day = 'Tuesday';
$day = current($transport); // $day = 'Tuesday';
$day = prev($transport);    // $day = 'Monday';
$day = end($transport);     // $day = 'Sunday';
$day = current($transport); // $day = 'Sunday';

To get the first element of array you can use current and for last element you can use end

Edit

Just for the sake for not getting any more down votes for the answer you can convert you key to value using array_keys and use as shown above.

Solution 25 - Php

use :

$array = ['po','co','so'];

echo reset($array); 

Result : po

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAlex SView Question on Stackoverflow
Solution 1 - PhpBlixtView Answer on Stackoverflow
Solution 2 - PhptroelsknView Answer on Stackoverflow
Solution 3 - PhpWebmutView Answer on Stackoverflow
Solution 4 - PhpjimyiView Answer on Stackoverflow
Solution 5 - PhpStopperView Answer on Stackoverflow
Solution 6 - PhpivanaugustobdView Answer on Stackoverflow
Solution 7 - PhpSergiy SokolenkoView Answer on Stackoverflow
Solution 8 - PhpMartyIXView Answer on Stackoverflow
Solution 9 - PhpPupilView Answer on Stackoverflow
Solution 10 - PhpHamidrezaView Answer on Stackoverflow
Solution 11 - PhpPupilView Answer on Stackoverflow
Solution 12 - PhpPrinsEdje80View Answer on Stackoverflow
Solution 13 - Phpvoodoo417View Answer on Stackoverflow
Solution 14 - PhpSalvi PascualView Answer on Stackoverflow
Solution 15 - PhpYuriy PetrovskiyView Answer on Stackoverflow
Solution 16 - PhpBenjamin BeganovićView Answer on Stackoverflow
Solution 17 - PhpAndreyPView Answer on Stackoverflow
Solution 18 - PhpShahroqView Answer on Stackoverflow
Solution 19 - PhpPijush GuptaView Answer on Stackoverflow
Solution 20 - PhpKohjah BreeseView Answer on Stackoverflow
Solution 21 - PhpRoupioz ClementView Answer on Stackoverflow
Solution 22 - PhpFabián FernándezView Answer on Stackoverflow
Solution 23 - PhpMauisterView Answer on Stackoverflow
Solution 24 - PhpPriyankView Answer on Stackoverflow
Solution 25 - PhpJaved KhanView Answer on Stackoverflow