How to get last key in an array?

PhpArrays

Php Problem Overview


How can I get the last key of an array?

Php Solutions


Solution 1 - Php

A solution would be to use a combination of end and key (quoting) :

  • end() advances array 's internal pointer to the last element, and returns its value.
  • key() returns the index element of the current array position.

So, a portion of code such as this one should do the trick :

$array = array(
    'first' => 123,
    'second' => 456,
    'last' => 789, 
);

end($array);         // move the internal pointer to the end of the array
$key = key($array);  // fetches the key of the element pointed to by the internal pointer

var_dump($key);

Will output :

string 'last' (length=4)

i.e. the key of the last element of my array.

After this has been done the array's internal pointer will be at the end of the array. As pointed out in the comments, you may want to run reset() on the array to bring the pointer back to the beginning of the array.

Solution 2 - Php

Although end() seems to be the easiest, it's not the fastest. The faster, and much stronger alternative is array_slice():

$lastKey = key(array_slice($array, -1, 1, true));

As the tests say, on an array with 500000 elements, it is almost 7x faster!

Solution 3 - Php

Since PHP 7.3 (2018) there is (finally) function for this: http://php.net/manual/en/function.array-key-last.php

$array = ['apple'=>10,'grape'=>15,'orange'=>20];
echo array_key_last ( $array )

will output

orange

Solution 4 - Php

I prefer

end(array_keys($myarr))

Solution 5 - Php

Just use : echo $array[count($array) - 1];

Solution 6 - Php

Dont know if this is going to be faster or not, but it seems easier to do it this way, and you avoid the error by not passing in a function to end()...

it just needed a variable... not a big deal to write one more line of code, then unset it if you needed to.

$array = array(
    'first' => 123,
    'second' => 456,
    'last' => 789, 
);

$keys = array_keys($array);
$last = end($keys);

Solution 7 - Php

As of PHP7.3 you can directly access the last key in (the outer level of) an array with array_key_last()

The definitively puts much of the debate on this page to bed. It is hands-down the best performer, suffers no side effects, and is a direct, intuitive, single-call technique to deliver exactly what this question seeks.

A rough benchmark as proof: https://3v4l.org/hO1Yf

> array_slice() + key(): 1.4 > end() + key(): 13.7 > array_key_last(): 0.00015 > *test array contains 500000 elements, microtime repeated 100x then averaged then multiplied by 1000 to avoid scientific notation. Credit to @MAChitgarha for the initial benchmark commented under @TadejMagajna's answer.

This means you can retrieve the value of the final key without:

  1. moving the array pointer (which requires two lines of code) or
  2. sorting, reversing, popping, counting, indexing an array of keys, or any other tomfoolery

This function was long overdue and a welcome addition to the array function tool belt that improves performance, avoids unwanted side-effects, and enables clean/direct/intuitive code.

Here is a demo:

$array = ["a" => "one", "b" => "two", "c" => "three"];
if (!function_exists('array_key_last')) {
    echo "please upgrade to php7.3";
} else {
    echo "First Key: " , key($array) , "\n";
    echo "Last Key: " , array_key_last($array) , "\n";
    next($array);                 // move array pointer to second element
    echo "Second Key: " , key($array) , "\n";
    echo "Still Last Key: " , array_key_last($array);
}

Output:

First Key: a
Last Key: c     // <-- unaffected by the pointer position, NICE!
Second Key: b
Last Key: c     // <-- unaffected by the pointer position, NICE!

Some notes:

  • array_key_last() is the sibling function of array_key_first().
  • Both of these functions are "pointer-ignorant".
  • Both functions return null if the array is empty.
  • Discarded sibling functions (array_value_first() & array_value_last()) also would have offered the pointer-ignorant access to bookend elements, but they evidently failed to garner sufficient votes to come to life.

Here are some relevant pages discussing the new features:

p.s. If anyone is weighing up some of the other techniques, you may refer to this small collection of comparisons: (Demo)

> Duration of array_slice() + key(): 0.35353660583496 > Duration of end() + key(): 6.7495584487915 > Duration of array_key_last(): 0.00025749206542969 > Duration of array_keys() + end(): 7.6123380661011 > Duration of array_reverse() + key(): 6.7875385284424 > Duration of array_slice() + foreach(): 0.28870105743408

Solution 8 - Php

As of PHP >= 7.3 array_key_last() is the best way to get the last key of any of an array. Using combination of end(), key() and reset() just to get last key of an array is outrageous.

$array = array("one" => bird, "two" => "fish", 3 => "elephant");
$key = array_key_last($array);
var_dump($key) //output 3

compare that to

end($array)
$key = key($array)
var_dump($key) //output 3
reset($array)

You must reset array for the pointer to be at the beginning if you are using combination of end() and key()

Solution 9 - Php

Try using array_pop and array_keys function as follows:

<?php

$array = array(
    'one' => 1,
    'two' => 2,
    'three' => 3
);

echo array_pop(array_keys($array)); // prints three

?>

Solution 10 - Php

It is strange, but why this topic is not have this answer:

$lastKey = array_keys($array)[count($array)-1];

Solution 11 - Php

I would also like to offer an alternative solution to this problem.

Assuming all your keys are numeric without any gaps, my preferred method is to count the array then minus 1 from that value (to account for the fact that array keys start at 0.

$array = array(0=>'dog', 1=>'cat');

$lastKey = count($array)-1;
$lastKeyValue = $array[$lastKey];

var_dump($lastKey);
print_r($lastKeyValue);

This would give you:

> int(1) cat

Solution 12 - Php

You can use this:

$array = array("one" => "apple", "two" => "orange", "three" => "pear");
end($array); 
echo key($array);

Another Solution is to create a function and use it:

function endKey($array){
end($array);
return key($array);
}

$array = array("one" => "apple", "two" => "orange", "three" => "pear");
echo endKey($array);

Solution 13 - Php

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

Solution 14 - Php

I just took the helper-function from Xander and improved it with the answers before:

function last($array){
  $keys = array_keys($array);
  return end($keys);
}


$arr = array("one" => "apple", "two" => "orange", "three" => "pear");    
echo last($arr);
echo $arr(last($arr));

Solution 15 - Php

Try this one with array_reverse().

 $arr = array(
     'first' => 01,
     'second' => 10,
     'third' => 20, 
 );  
 $key = key(array_reverse($arr));
 var_dump($key);

Solution 16 - Php

$array = array(
    'something' => array(1,2,3),
    'somethingelse' => array(1,2,3,4)
);

$last_value = end($array);
$last_key = key($array); // 'somethingelse'

This works because PHP moves it's array pointer internally for $array

Solution 17 - Php

The best possible solution that can be also used used inline:

end($arr) && false ?: key($arr)

This solution is only expression/statement and provides good is not the best possible performance.

Inlined example usage:

$obj->setValue(
    end($arr) && false ?: key($arr) // last $arr key
);


UPDATE: In PHP 7.3+: use (of course) the newly added array_key_last() method.

Solution 18 - Php

Try this to preserve compatibility with older versions of PHP:

$array_keys    = array_keys( $array );
$last_item_key = array_pop( $array_keys );

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
QuestionajsieView Question on Stackoverflow
Solution 1 - PhpPascal MARTINView Answer on Stackoverflow
Solution 2 - PhpTadej MagajnaView Answer on Stackoverflow
Solution 3 - PhpPatryk GodowskiView Answer on Stackoverflow
Solution 4 - PhpRutger van BarenView Answer on Stackoverflow
Solution 5 - PhpAditya ChoudharyView Answer on Stackoverflow
Solution 6 - PhpRyan HungateView Answer on Stackoverflow
Solution 7 - PhpmickmackusaView Answer on Stackoverflow
Solution 8 - PhpHilary OkoroView Answer on Stackoverflow
Solution 9 - PhpcodaddictView Answer on Stackoverflow
Solution 10 - PhpAlexView Answer on Stackoverflow
Solution 11 - Phpuser2732377View Answer on Stackoverflow
Solution 12 - PhpAtif TariqView Answer on Stackoverflow
Solution 13 - Phpvoodoo417View Answer on Stackoverflow
Solution 14 - PhpSteveView Answer on Stackoverflow
Solution 15 - PhpVishal KumarView Answer on Stackoverflow
Solution 16 - PhpScottymeukView Answer on Stackoverflow
Solution 17 - PhpmvorisekView Answer on Stackoverflow
Solution 18 - PhpAzamatView Answer on Stackoverflow