Get the first element of an array

PhpArrays

Php Problem Overview


I have an array:

array( 4 => 'apple', 7 => 'orange', 13 => 'plum' )

I would like to get the first element of this array. Expected result: string apple

One requirement: it cannot be done with passing by reference, so array_shift is not a good solution.

How can I do this?

Php Solutions


Solution 1 - Php

Original answer, but costly (O(n)):

array_shift(array_values($array));

In O(1):

array_pop(array_reverse($array));

Other use cases, etc...

If modifying (in the sense of resetting array pointers) of $array is not a problem, you might use:

reset($array);

This should be theoretically more efficient, if a array "copy" is needed:

array_shift(array_slice($array, 0, 1));

With PHP 5.4+ (but might cause an index error if empty):

array_values($array)[0];

Solution 2 - Php

As Mike pointed out (the easiest possible way):

$arr = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );
echo reset($arr); // Echoes "apple"

If you want to get the key: (execute it after reset)

echo key($arr); // Echoes "4"

From PHP's documentation:

> mixed reset ( array | object &$array );

Description:

> reset() rewinds array's internal pointer to the first element and returns the value of the first array element, or FALSE if the array is > empty.

Solution 3 - Php

$first_value = reset($array); // First element's value
$first_key = key($array); // First element's key

Solution 4 - Php

current($array)

returns the first element of an array, according to the PHP manual.

> Every array has an internal pointer to its "current" element, which is initialized to the first element inserted into the array.

So it works until you have re-positioned the array pointer, and otherwise you'll have to use reset() which ll rewind array and ll return first element of array

According to the PHP manual reset.

> reset() rewinds array's internal pointer to the first element and returns the value of the first array element.

Examples of current() and reset()

$array = array('step one', 'step two', 'step three', 'step four');

// by default, the pointer is on the first element
echo current($array) . "<br />\n"; // "step one"

//Forward the array pointer and then reset it

// skip two steps
next($array);
next($array);
echo current($array) . "<br />\n"; // "step three"

// reset pointer, start again on step one
echo reset($array) . "<br />\n"; // "step one"

Solution 5 - Php

$arr = $array = array( 9 => 'apple', 7 => 'orange', 13 => 'plum' );
echo reset($arr); // echoes 'apple'

If you don't want to lose the current pointer position, just create an alias for the array.

Solution 6 - Php

You can get the Nth element with a language construct, "list":

// First item
list($firstItem) = $yourArray;

// First item from an array that is returned from a function
list($firstItem) = functionThatReturnsArray();

// Second item
list( , $secondItem) = $yourArray;

With the array_keys function you can do the same for keys:

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

Solution 7 - Php

PHP 7.3 added two functions for getting the first and the last key of an array directly without modification of the original array and without creating any temporary objects:

Apart from being semantically meaningful, these functions don't even move the array pointer (as foreach would do).

Having the keys, one can get the values by the keys directly.


Examples (all of them require PHP 7.3+)

Getting the first/last key and value:
$my_array = ['IT', 'rules', 'the', 'world'];

$first_key = array_key_first($my_array);
$first_value = $my_array[$first_key];

$last_key = array_key_last($my_array);
$last_value = $my_array[$last_key];
Getting the first/last value as one-liners, assuming the array cannot be empty:
$first_value = $my_array[ array_key_first($my_array) ];

$last_value = $my_array[ array_key_last($my_array) ];
Getting the first/last value as one-liners, with defaults for empty arrays:
$first_value = empty($my_array) ? 'default' : $my_array[ array_key_first($my_array) ];

$last_value = empty($my_array) ? 'default' : $my_array[ array_key_last($my_array) ];

Solution 8 - Php

PHP 5.4+:

array_values($array)[0];

Solution 9 - Php

Some arrays don't work with functions like list, reset or current. Maybe they're "faux" arrays - partially implementing ArrayIterator, for example.

If you want to pull the first value regardless of the array, you can short-circuit an iterator:

foreach($array_with_unknown_keys as $value) break;

Your value will then be available in $value and the loop will break after the first iteration. This is more efficient than copying a potentially large array to a function like array_unshift(array_values($arr)).

You can grab the key this way too:

foreach($array_with_unknown_keys as $key=>$value) break;

If you're calling this from a function, simply return early:

function grab_first($arr) {
	foreach($arr as $value) return $value;
}

Solution 10 - Php

Suppose:

$array = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );

Just use:

$array[key($array)]

to get first element or

key($array)

to get first key.

Or you can unlink the first if you want to remove it.

Solution 11 - Php

From Laravel's helpers:

function head($array)
{
    return reset($array);
}

The array being passed by value to the function, the reset() affects the internal pointer of a copy of the array, and it doesn't touch the original array (note it returns false if the array is empty).

Usage example:

$data = ['foo', 'bar', 'baz'];

current($data); // foo
next($data); // bar
head($data); // foo
next($data); // baz

Also, here is an alternative. It's very marginally faster, but more interesting. It lets easily change the default value if the array is empty:

function head($array, $default = null)
{
    foreach ($array as $item) {
        return $item;
    }
    return $default;
}

For the record, here is another answer of mine, for the array's last element.

Solution 12 - Php

Keep this simple! There are lots of correct answers here, but to minimize all the confusion, these two work and reduce a lot of overhead:

key($array) gets the first key of an array
current($array) gets the first value of an array


EDIT:
Regarding the comments below. The following example will output: string(13) "PHP code test"

$array = array
(
   '1'           => 'PHP code test',  
   'foo'         => 'bar', 5 , 5 => 89009, 
   'case'        => 'Random Stuff: '.rand(100,999),
   'PHP Version' => phpversion(),
   0             => 'ending text here'
);

var_dump(current($array));

Solution 13 - Php

Simply do:

array_shift(array_slice($array,0,1));

Solution 14 - Php

$arr = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );
foreach($arr as $first) break;
echo $first;

Output:

apple

Solution 15 - Php

I would do echo current($array) .

Solution 16 - Php

PHP 7.3 added two functions for getting the first and the last key of an array directly without modification of the original array and without creating any temporary objects:

"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($arr) {
        foreach($arr as $key => $unused) {
            return $key;
        }
        return NULL;
    }
}

if (!function_exists('array_key_last')) {
    function array_key_last($arr) {
        return array_key_first(array_reverse($arr, true));
    }
}
?>

Solution 17 - Php

$myArray = array (4 => 'apple', 7 => 'orange', 13 => 'plum');
$arrayKeys = array_keys($myArray);

// The first element of your array is:
echo $myArray[$arrayKeys[0]];

Solution 18 - Php

Get first element:

array_values($arr)[0]

Get last element

array_reverse($arr)[0]

Solution 19 - Php

$array=array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );

$firstValue = each($array)[1];

This is much more efficient than array_values() because the each() function does not copy the entire array.

For more info see http://www.php.net/manual/en/function.each.php

Solution 20 - Php

A kludgy way is:

$foo = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );

function get_first ($foo) {
    foreach ($foo as $k=>$v){
        return $v;
    }
}

print get_first($foo);

Solution 21 - Php

Most of these work! BUT for a quick single line (low resource) call:

$array = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );
echo $array[key($array)];

// key($array) -> will return the first key (which is 4 in this example)

Although this works, and decently well, please also see my additional answer: https://stackoverflow.com/a/48410351/1804013

Solution 22 - Php

Use:

$first = array_slice($array, 0, 1);  
$val= $first[0];

By default, array_slice does not preserve keys, so we can safely use zero as the index.

Solution 23 - Php

This is a little late to the game, but I was presented with a problem where my array contained array elements as children inside it, and thus I couldn't just get a string representation of the first array element. By using PHP's current() function, I managed this:

<?php
    $original = array(4 => array('one', 'two'), 7 => array('three', 'four'));
    reset($original);  // to reset the internal array pointer...
    $first_element = current($original);  // get the current element...
?>

Thanks to all the current solutions helped me get to this answer, I hope this helps someone sometime!

Solution 24 - Php

<?php
    $arr = array(3 => "Apple", 5 => "Ball", 11 => "Cat");
    echo array_values($arr)[0]; // Outputs: Apple
?>

Other Example:

<?php
    $arr = array(3 => "Apple", 5 => "Ball", 11 => "Cat");
    echo current($arr); // Outputs: Apple
    echo reset($arr); // Outputs: Apple
    echo next($arr); // Outputs: Ball
    echo current($arr); // Outputs: Ball
    echo reset($arr); // Outputs: Apple
?>

Solution 25 - Php

I think using array_values would be your best bet here. You could return the value at index zero from the result of that function to get 'apple'.

Solution 26 - Php

Two solutions for you.

Solution 1 - Just use the key. You have not said that you can not use it. :)

<?php
    // Get the first element of this array.
    $array = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );

    // Gets the first element by key
    $result = $array[4];

    // Expected result: string apple
    assert('$result === "apple" /* Expected result: string apple. */');
?>

Solution 2 - array_flip() + key()

<?php
    // Get first element of this array. Expected result: string apple
    $array = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );

    // Turn values to keys
    $array = array_flip($array);

    // You might thrown a reset in just to make sure
    // that the array pointer is at the first element.
    // Also, reset returns the first element.
    // reset($myArray);

    // Return the first key
    $firstKey = key($array);

    assert('$firstKey === "apple" /* Expected result: string apple. */');
?>

Solution 3 - array_keys()

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

Solution 27 - Php

I imagine the author just was looking for a way to get the first element of an array after getting it from some function (mysql_fetch_row, for example) without generating a STRICT "Only variables should be passed by reference".

If it so, almost all the ways described here will get this message... and some of them uses a lot of additional memory duplicating an array (or some part of it). An easy way to avoid it is just assigning the value inline before calling any of those functions:

$first_item_of_array = current($tmp_arr = mysql_fetch_row(...));
// or
$first_item_of_array = reset($tmp_arr = func_get_my_huge_array());

This way you don't get the STRICT message on screen, nor in logs, and you don't create any additional arrays. It works with both indexed AND associative arrays.

Solution 28 - Php

No one has suggested using the ArrayIterator class:

$array = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );
$first_element = (new ArrayIterator($array))->current();
echo $first_element; //'apple'

gets around the by reference stipulation of the OP.

Solution 29 - Php

This is not so simple response in the real world. Suppose that we have these examples of possible responses that you can find in some libraries.

$array1 = array();
$array2 = array(1,2,3,4);
$array3 = array('hello'=>'world', 'foo'=>'bar');
$array4 = null;

var_dump('reset1', reset($array1));
var_dump('reset2', reset($array2));
var_dump('reset3', reset($array3));
var_dump('reset4', reset($array4)); // Warning

var_dump('array_shift1', array_shift($array1));
var_dump('array_shift2', array_shift($array2));
var_dump('array_shift3', array_shift($array3));
var_dump('array_shift4', array_shift($array4)); // Warning

var_dump('each1', each($array1));
var_dump('each2', each($array2));
var_dump('each3', each($array3));
var_dump('each4', each($array4)); // Warning

var_dump('array_values1', array_values($array1)[0]); // Notice
var_dump('array_values2', array_values($array2)[0]);
var_dump('array_values3', array_values($array3)[0]);
var_dump('array_values4', array_values($array4)[0]); // Warning

var_dump('array_slice1', array_slice($array1, 0, 1));
var_dump('array_slice2', array_slice($array2, 0, 1));
var_dump('array_slice3', array_slice($array3, 0, 1));
var_dump('array_slice4', array_slice($array4, 0, 1)); // Warning

list($elm) = $array1; // Notice
var_dump($elm);
list($elm) = $array2;
var_dump($elm);
list($elm) = $array3; // Notice
var_dump($elm);
list($elm) = $array4;
var_dump($elm);

Like you can see, we have several 'one line' solutions that work well in some cases, but not in all.

In my opinion, you have should that handler only with arrays.

Now talking about performance, assuming that we have always array, like this:

$elm = empty($array) ? null : ...($array);

...you would use without errors:
$array[count($array)-1];
array_shift
reset
array_values
array_slice

array_shift is faster than reset, that is more fast than [count()-1], and these three are faster than array_values and array_slice.

Solution 30 - Php

Use array_keys() to access the keys of your associative array as a numerical indexed array, which is then again can be used as key for the array.

When the solution is arr[0]:

> (Note, that since the array with the keys is 0-based index, the 1st > element is index 0)

You can use a variable and then subtract one, to get your logic, that 1 => 'apple'.

$i = 1;
$arr = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );
echo $arr[array_keys($arr)[$i-1]];

Output:

apple

Well, for simplicity- just use:

$arr = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );
echo $arr[array_keys($arr)[0]];

Output:

apple

By the first method not just the first element, but can treat an associative array like an indexed array.

Solution 31 - Php

I don't like fiddling with the array's internal pointer, but it's also inefficient to build a second array with array_keys() or array_values(), so I usually define this:

function array_first(array $f) {
    foreach ($f as $v) {
        return $v;
    }
    throw new Exception('array was empty');
}

Solution 32 - Php

Try this:

$fruits = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );
echo reset($fruits)."\n";

Solution 33 - Php

One line closure, copy, reset:

<?php

$fruits = array(4 => 'apple', 7 => 'orange', 13 => 'plum');

echo (function() use ($fruits) { return reset($fruits); })();

Output:

apple

Alternatively the shorter short arrow function:

echo (fn() => reset($fruits))();

This uses by-value variable binding as above. Both will not mutate the original pointer.

Solution 34 - Php

A small change to what Sarfraz posted is:

$array = array(1, 2, 3, 4, 5);
$output = array_slice($array, 0, 1);
print_r ($output);

Solution 35 - Php

I like the "list" example, but "list" only works on the left-hand-side of an assignment. If we don't want to assign a variable, we would be forced to make up a temporary name, which at best pollutes our scope and at worst overwrites an existing value:

list($x) = some_array();
var_dump($x);

The above will overwrite any existing value of $x, and the $x variable will hang around as long as this scope is active (the end of this function/method, or forever if we're in the top-level). This can be worked around using call_user_func and an anonymous function, but it's clunky:

var_dump(call_user_func(function($arr) { list($x) = $arr; return $x; },
                        some_array()));

If we use anonymous functions like this, we can actually get away with reset and array_shift, even though they use pass-by-reference. This is because calling a function will bind its arguments, and these arguments can be passed by reference:

var_dump(call_user_func(function($arr) { return reset($arr); },
                        array_values(some_array())));

However, this is actually overkill, since call_user_func will perform this temporary assignment internally. This lets us treat pass-by-reference functions as if they were pass-by-value, without any warnings or errors:

var_dump(call_user_func('reset', array_values(some_array())));

Solution 36 - Php

Also worth bearing in mind is the context in which you're doing this, as an exhaustive check can be expensive and not always necessary.

For example, this solution works fine for the situation in which I'm using it (but obviously it can't be relied on in all cases...)

 /**
 * A quick and dirty way to determine whether the passed in array is associative or not, assuming that either:<br/>
 * <br/>
 * 1) All the keys are strings - i.e. associative<br/>
 * or<br/>
 * 2) All the keys are numeric - i.e. not associative<br/>
 *
 * @param array $objects
 * @return boolean
 */
private function isAssociativeArray(array $objects)
{
    // This isn't true in the general case, but it's a close enough (and quick) approximation for the context in
    // which we're using it.

    reset($objects);
    return count($objects) > 0 && is_string(key($objects));
}

Solution 37 - Php

Nice one with a combination of array_slice and implode:

$arr = array(1, 2, 3);
echo implode(array_slice($arr, 0, 1));
// Outputs 1

/*---------------------------------*/

$arr = array(
    'key_1' => 'One',
    'key_2' => 'Two',
    'key_3' => 'Three',
);
echo implode(array_slice($arr, 0, 1));
// Outputs One

Solution 38 - Php

You can get the first element by using this coding:

$array_key_set = array_keys($array);
$first_element = $array[$array_key_set[0]];

Or use:

$i=0;
foreach($array as $arr)
{
  if($i==0)
  {
    $first_element=$arr;
    break;
  }
 $i++;
}
echo $first_element;

Solution 39 - Php

There are too many answers here, and the selected answer will work for most of the cases.

In my case, I had a 2D array, and array_values for some odd reason was removing the keys on the inner arrays. So I end up with this:

$keys = array_keys($myArray); // Fetches all the keys
$firstElement = $myArray[$keys[0]]; // Get the first element using first key

Solution 40 - Php

Here is a performance statistics on PHP 8.1.3:

> list($fruit) = $fruits timing: 0.0010569095611572 but does not work for associative arrays > > $fruit = current($fruits) timing: 0.0011630058288574 > > $fruit = array_values($fruits)[0] timing: 0.0014832019805908 > > $fruit = reset($fruits) timing: 0.001446008682251 > > $fruit = $fruits[key($fruits)] timing: 0.0014619827270508 > > $fruit = array_shift(array_slice($array, 0, 1)) timing: > 0.027630090713501 > > $fruit = array_shift(array_values($fruits)) timing: 0.028067111968994 > (memory consuming) > > $fruit = array_pop(array_reverse($fruits)) timing: 0.027246952056885 > (memory consuming)

Source code:

<?php

$fruits = array('lemon', 'banana', 'apple', 'orange');



$startTime = microtime(true);
for ($i = 0; $i < 100000; $i++) {
        list($fruit) = $fruits;
}
$endTime = microtime(true);
echo '

list($fruit) = $fruits timing: '.  ($endTime-$startTime);


$startTime = microtime(true);
for ($i = 0; $i < 100000; $i++) {
        $fruit = current($fruits);
}
$endTime = microtime(true);
echo '

$fruit = current($fruits) timing: '.  ($endTime-$startTime);



$startTime = microtime(true);
for ($i = 0; $i < 100000; $i++) {
        $fruit = array_values($fruits)[0];
}
$endTime = microtime(true);
echo '

$fruit = array_values($fruits)[0] timing: '.  ($endTime-$startTime);


$startTime = microtime(true);
for ($i = 0; $i < 100000; $i++) {
        $fruit = reset($fruits);
}
$endTime = microtime(true);
echo '

$fruit = reset($fruits) timing: '.  ($endTime-$startTime);



$startTime = microtime(true);
for ($i = 0; $i < 100000; $i++) {
        $fruit = $fruits[key($fruits)];
}
$endTime = microtime(true);
echo '

$fruit = $fruits[key($fruits)] timing: '.  ($endTime-$startTime);



$startTime = microtime(true);
for ($i = 0; $i < 100000; $i++) {
        $fruit = array_shift(array_slice($fruits, 0, 1));
}
$endTime = microtime(true);
echo '

$fruit = array_shift(array_slice($array, 0, 1)) timing: '.  ($endTime-$startTime);




$startTime = microtime(true);
for ($i = 0; $i < 100000; $i++) {
        $fruit = array_shift(array_values($fruits));
}
$endTime = microtime(true);
echo '

$fruit = array_shift(array_values($fruits)) timing: '.  ($endTime-$startTime) . ' (memory consuming)';



$startTime = microtime(true);
for ($i = 0; $i < 100000; $i++) {
        $fruit = array_pop(array_reverse($fruits));
}
$endTime = microtime(true);
echo '

$fruit = array_pop(array_reverse($fruits)) timing: '.  ($endTime-$startTime) . ' (memory consuming)';

Solution 41 - Php

Finding the first and last items in an array:

// Get the first item in the array
print $array[0]; // Prints 1

// Get the last item in the array
print end($array);

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
QuestionhszView Question on Stackoverflow
Solution 1 - PhpblueyedView Answer on Stackoverflow
Solution 2 - PhplepeView Answer on Stackoverflow
Solution 3 - PhpIjas AmeenudeenView Answer on Stackoverflow
Solution 4 - PhpTofeeqView Answer on Stackoverflow
Solution 5 - PhpyodaView Answer on Stackoverflow
Solution 6 - PhpSergiy SokolenkoView Answer on Stackoverflow
Solution 7 - PhpAlex ShesterovView Answer on Stackoverflow
Solution 8 - PhpSamer AtaView Answer on Stackoverflow
Solution 9 - PhpLee BensonView Answer on Stackoverflow
Solution 10 - PhpLucasView Answer on Stackoverflow
Solution 11 - PhpGras DoubleView Answer on Stackoverflow
Solution 12 - PhptfontView Answer on Stackoverflow
Solution 13 - PhpDiverseAndRemote.comView Answer on Stackoverflow
Solution 14 - PhptekinView Answer on Stackoverflow
Solution 15 - Phpuser1485518View Answer on Stackoverflow
Solution 16 - PhpAndreyPView Answer on Stackoverflow
Solution 17 - PhpJacob ToppingView Answer on Stackoverflow
Solution 18 - PhpAdobeView Answer on Stackoverflow
Solution 19 - PhprustyxView Answer on Stackoverflow
Solution 20 - PhpWilliam MacdonaldView Answer on Stackoverflow
Solution 21 - PhptfontView Answer on Stackoverflow
Solution 22 - PhpBaziView Answer on Stackoverflow
Solution 23 - PhpChris KempenView Answer on Stackoverflow
Solution 24 - PhpMahdi BashirpourView Answer on Stackoverflow
Solution 25 - PhpjmkingView Answer on Stackoverflow
Solution 26 - PhpJens A. KochView Answer on Stackoverflow
Solution 27 - PhpdmikamView Answer on Stackoverflow
Solution 28 - Phppgee70View Answer on Stackoverflow
Solution 29 - PhpSteven KochView Answer on Stackoverflow
Solution 30 - PhpAtaboy JosefView Answer on Stackoverflow
Solution 31 - PhpJesseView Answer on Stackoverflow
Solution 32 - PhpWakar Ahmad KhanView Answer on Stackoverflow
Solution 33 - PhpProgrockView Answer on Stackoverflow
Solution 34 - PhpJan DetlefsenView Answer on Stackoverflow
Solution 35 - PhpWarboView Answer on Stackoverflow
Solution 36 - PhpDan KingView Answer on Stackoverflow
Solution 37 - PhpNabil KadimiView Answer on Stackoverflow
Solution 38 - PhpKarthikeyan GanesanView Answer on Stackoverflow
Solution 39 - PhpUsman ShaukatView Answer on Stackoverflow
Solution 40 - PhpEugene KaurovView Answer on Stackoverflow
Solution 41 - PhpArun KushwahaView Answer on Stackoverflow