211

If I had an array like:

$array['foo'] = 400;
$array['bar'] = 'xyz';

And I wanted to get the first item out of that array without knowing the key for it, how would I do that? Is there a function for this?

Ali
  • 261,656
  • 265
  • 575
  • 769
  • *(reference)* [Arrays](http://de2.php.net/manual/en/language.types.array.php) and [Array Functions](http://php.net/manual/en/ref.array.php) – Gordon Apr 30 '11 at 11:54

16 Answers16

370

reset() gives you the first value of the array if you have an element inside the array:

$value = reset($array);

It also gives you FALSE in case the array is empty.

Abhi Beckert
  • 32,787
  • 12
  • 83
  • 110
soulmerge
  • 73,842
  • 19
  • 118
  • 155
109

PHP < 7.3

If you don't know enough about the array (you're not sure whether the first key is foo or bar) then the array might well also be, maybe, empty.

So it would be best to check, especially if there is the chance that the returned value might be the boolean FALSE:

$value = empty($arr) ? $default : reset($arr);

The above code uses reset and so has side effects (it resets the internal pointer of the array), so you might prefer using array_slice to quickly access a copy of the first element of the array:

$value = $default;
foreach(array_slice($arr, 0, 1) as $value);

Assuming you want to get both the key and the value separately, you need to add the fourth parameter to array_slice:

foreach(array_slice($arr, 0, 1, true) as $key => $value);

To get the first item as a pair (key => value):

$item = array_slice($arr, 0, 1, true);

Simple modification to get the last item, key and value separately:

foreach(array_slice($arr, -1, 1, true) as $key => $value);

performance

If the array is not really big, you don't actually need array_slice and can rather get a copy of the whole keys array, then get the first item:

$key = count($arr) ? array_keys($arr)[0] : null;

If you have a very big array, though, the call to array_keys will require significant time and memory more than array_slice (both functions walk the array, but the latter terminates as soon as it has gathered the required number of items - which is one).

A notable exception is when you have the first key which points to a very large and convoluted object. In that case array_slice will duplicate that first large object, while array_keys will only grab the keys.

PHP 7.3+

PHP 7.3 onwards implements array_key_first() as well as array_key_last(). These are explicitly provided to access first and last keys efficiently without resetting the array's internal state as a side effect.

So since PHP 7.3 the first value of $array may be accessed with

$array[array_key_first($array)];

You still had better check that the array is not empty though, or you will get an error:

$firstKey = array_key_first($array);
if (null === $firstKey) {
    $value = "Array is empty"; // An error should be handled here
} else {
    $value = $array[$firstKey];
}
LSerni
  • 55,617
  • 10
  • 65
  • 107
  • @AhmedShefeer well, the other answer is not only the *accepted* one but has been there for *eight more years*. I'm sort of picking up the crumbs here :-D . But thanks for the vote of confidence! – LSerni Jun 26 '18 at 16:07
  • 3
    It looks to me like this is the best answer, since the only other non-deprecated one that gives both the key and value is the aborted foreach loop, which is awkward. The other answers give only the value without the key. – sootsnoot Oct 24 '18 at 00:15
  • 2
    loved this ans, modern approach and updated with time. – sanjeet bisht Jan 20 '19 at 12:18
  • 1
    @LSerni Don't know if you are still active , but I was stuck and this well explained and updated post saved me. Thank you – izk Jun 03 '19 at 07:33
  • @izk I'm always active! :-D – LSerni Jun 03 '19 at 08:03
  • Bump this as the answer. We live in a 7.3+ world nowadays. – theking2 Nov 13 '21 at 21:52
54

Fake loop that breaks on the first iteration:

$key = $value = NULL;
foreach ($array as $key => $value) {
    break;
}

echo "$key = $value\n";

Or use each() (warning: deprecated as of PHP 7.2.0):

reset($array);
list($key, $value) = each($array);

echo "$key = $value\n";
John Kugelman
  • 349,597
  • 67
  • 533
  • 578
32

There's a few options. array_shift() will return the first element, but it will also remove the first element from the array.

$first = array_shift($array);

current() will return the value of the array that its internal memory pointer is pointing to, which is the first element by default.

$first = current($array);

If you want to make sure that it is pointing to the first element, you can always use reset().

reset($array);
$first = current($array);
Paige Ruten
  • 172,675
  • 36
  • 177
  • 197
  • 3
    I like this answer as most complete, but note `reset()` actually returns the element, so following that with a `$first = current($array)` is redundant. – Tom Auger Jul 15 '13 at 14:45
18

another easy and simple way to do it use array_values

array_values($array)[0]
Beginner
  • 4,118
  • 3
  • 17
  • 26
  • `reset()` is a much better option since it returns false if the array is empty. your solution won't work for example in the question – Northys Jun 20 '17 at 21:15
  • 3
    In PHP 7+ something like this would work: `array_values($array)[0] ?? FALSE` – MarthyM Feb 07 '18 at 15:40
13

Just so that we have some other options: reset($arr); good enough if you're not trying to keep the array pointer in place, and with very large arrays it incurs an minimal amount of overhead. That said, there are some problems with it:

$arr = array(1,2);
current($arr); // 1
next($arr);    // 2
current($arr); // 2
reset($arr);   // 1
current($arr); // 1 !This was 2 before! We've changed the array's pointer.

The way to do this without changing the pointer:

$arr[reset(array_keys($arr))]; // OR
reset(array_values($arr));

The benefit of $arr[reset(array_keys($arr))]; is that it raises an warning if the array is actually empty.

cwallenpoole
  • 79,954
  • 26
  • 128
  • 166
6

Test if the a variable is an array before getting the first element. When dynamically creating the array if it is set to null you get an error.

For Example:

if(is_array($array))
{
  reset($array);
  $first = key($array);
}
cwallenpoole
  • 79,954
  • 26
  • 128
  • 166
w3bMak3r
  • 882
  • 8
  • 13
4

We can do $first = reset($array);

Instead of

reset($array);
$first = current($array);

As reset()

returns the first element of the array after reset;

treyBake
  • 6,440
  • 6
  • 26
  • 57
4

You could use array_values

$firstValue = array_values($array)[0];
evelikov92
  • 755
  • 3
  • 8
  • 30
3

You can make:

$values = array_values($array);
echo $values[0];
d0niek
  • 218
  • 1
  • 12
2

You can try this.

To get first value of the array :-

<?php
   $large_array = array('foo' => 'bar', 'hello' => 'world');
   var_dump(current($large_array));
?>

To get the first key of the array

<?php
   $large_array = array('foo' => 'bar', 'hello' => 'world');
   $large_array_keys = array_keys($large_array);
   var_dump(array_shift($large_array_keys));
?>
Dave
  • 3,073
  • 7
  • 20
  • 33
Walk
  • 1,531
  • 17
  • 21
2

Use reset() function to get the first item out of that array without knowing the key for it like this.

$value = array('foo' => 400, 'bar' => 'xyz');
echo reset($value);

output // 400

2

Starting with PHP 7.3.0 it's possible to do without resetting the internal pointer. You would use array_key_first. If you're sure that your array has values it in then you can just do:

$first = $array[array_key_first($array)];

More likely, you'll want to handle the case where the array is empty:

$first = (empty($array)) ? $default : $array[array_key_first($array)];
cjc
  • 731
  • 3
  • 13
2

In one line:

$array['foo'] = 400;
$array['bar'] = 'xyz';
echo 'First value= ' . $array[array_keys($array)[0]];

Expanded:

$keys = array_keys($array);
$key = $keys[0];
$value = $array[$key];
echo 'First value = ' . $value;
S0S
  • 23
  • 3
1

You could use array_shift

Ali
  • 261,656
  • 265
  • 575
  • 769
Cesar
  • 4,076
  • 8
  • 44
  • 68
1

I do this to get the first and last value. This works with more values too.

$a = array(
    'foo' => 400,
    'bar' => 'xyz',
);
$first = current($a);   //400
$last = end($a);    //xyz
Daantje
  • 2,406
  • 25
  • 26
  • 1
    This only works when the internal pointer is at the first element. While this is good because it doesn't reset the position of the pointer, it only works when the pointer is already rest. – cjc Oct 10 '18 at 14:35