PHP - How to get the element before the last element from an array?

66,977

Solution 1

$array[count($array)-2]

It should be a numerically indexed array (from zero). You should have at least 2 elements for this to work. (obviously)

Solution 2

This will work even on this array:

$array[0] = "hello";
$array[5] = "how";
$array[9] = "are";

end($array);
echo prev($array); // will print "how"

The other solutions using count() are assuming that the indexes of your array go in order; by using end and prev to move the array pointer, you get the actual values. Try using the count() method on the array above and it will fail.

Solution 3

array_slice takes a negative offset as the second argument. This will give you a single item array containing the second last item:

$arr = array(1,2,3,4,5,6);
array_slice($arr, -2, 1);

If you just want the single value on it's own you have several options. If you don't mind using an intermediate variable you can then just get the first value with [0] or call array_pop or array_shift, they both need a variable passed by reference or you'll get warnings in strict mode.

Or you could just use array_sum or array_product, which is a bit hacky but works fine for single item arrays.

Solution 4

A method that will work for both associative array and numeric array is to use array_pop() to pop the element off the end of array.

$last = array_pop($array);
$second_last = array_pop($array);

// put back the last
array_push($array, $last);

Solution 5

All arrays have an "internal array pointer" which points to the current array element, PHP has several functions which allow you to navigate through the array and view the current elements key and value.

  • end() - Set the internal pointer of an array to its last element
  • reset() - Set the internal pointer of an array to its first element
  • prev() - Rewind the internal array pointer
  • next() - Advance the internal array pointer of an array
  • current() - Return the current element in an array
  • key() - Fetch a key from an array
  • each() - Return the current key and value pair from an array and advance the array cursor

These functions work whether the array is empty, sequential or associative and as an array has not been specified in the example i've assumed this must work with any array.

$array = array(
    'before_last' => false,
    'last' => false,
);

end($array); /* 
- set pointer to last element -> $array['last']
- return new current element value if it exists, -> false
- else return FALSE 
*/

prev($array); /* 
- set pointer one place before current pointer -> $array['before_last']
- return new current element value if it exists, -> false
- else return FALSE 
*/

if(!is_null(key($array)){ /* 
- return current element key if it exists -> "before_last"
- else return NULL
*/
    $before_last_element_value = current($array); /* 
    - return current element value if it exists, -> false
    - else return FALSE 
    */
}

As you can see the expected result (false) and the result for a nonexistent element is the same (FALSE) so you cannot check whether an element exists using the returned element value, an element key is different.

The key can either be an integer or a string. The value can be of any type. source

The key() returns the value of the current key if the element exists otherwise it will return NULL. A valid key can never be NULL so if null is returned we can determine that the element does not exist.

Share:
66,977
Robocop
Author by

Robocop

Updated on October 06, 2020

Comments

  • Robocop
    Robocop over 3 years

    How can I get the element before the last element from an array in PHP5 ?

  • Wally Lawless
    Wally Lawless about 14 years
    Erik's answer is more correct, not only does it account for the case he indicated with non-sequential keys, but will work with associative arrays as well (Arrays with strings as keys)
  • Notinlist
    Notinlist over 12 years
    The question lightly suggests that the subject is a linear array. When the array contains a single element and error_reporting(E_ALL) is set then my solution fails with Notice: Undefined offset: -1 in /test.php on line 3. Erik's solution fails silently. That is bad.
  • Praesagus
    Praesagus over 10 years
    Nice flexible solution for getting variable points in an array. implode('',array_slice($arr, -2, 1)) gets it in one line.
  • InanisAtheos
    InanisAtheos over 10 years
    This is brilliant. I tried using the solution marked with the checkmark, but couldn't make it work with my arrays (anything from 1 to 20 possible counts). Your solution worked like a charm. Thx.