PHP - Как получить элемент перед последним элементом из массива? - PullRequest
45 голосов
/ 03 февраля 2010

Как я могу получить элемент перед последним элементом из массива в PHP5?

Ответы [ 7 ]

117 голосов
/ 03 февраля 2010

Это будет работать даже для этого массива:

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

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

Другие решения, использующие count (), предполагают, что индексы вашего массива идут в порядке;используя end и prev для перемещения указателя массива, вы получаете фактические значения.Попробуйте использовать метод count () в приведенном выше массиве, и он потерпит неудачу.

68 голосов
/ 03 февраля 2010
$array[count($array)-2]

Это должен быть численно индексированный массив (с нуля). У вас должно быть как минимум 2 элемента, чтобы это работало. (Очевидно)

16 голосов
/ 03 февраля 2010

array_slice принимает отрицательное смещение в качестве второго аргумента. Это даст вам один массив элементов, содержащий второй последний элемент:

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

Если вам нужно только одно значение, у вас есть несколько вариантов. Если вы не возражаете против использования промежуточной переменной, вы можете просто получить первое значение с помощью [0] или вызвать array_pop или array_shift, им обоим нужна переменная, переданная по ссылке, или вы получите предупреждения в строгом режиме.

Или вы можете просто использовать array_sum или array_product, что немного странно, но отлично работает для массивов из одного элемента.

15 голосов
/ 06 января 2014

Как по мне, довольно крошечное решение

end($array);
echo prev($array);
6 голосов
/ 03 февраля 2010

Метод, который будет работать как для ассоциативного массива, так и для числового массива, заключается в использовании array_pop() для извлечения элемента из конца массива.

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

// put back the last
array_push($array, $last);
4 голосов
/ 18 мая 2016

Все массивы имеют «внутренний указатель массива» , который указывает на текущий элемент массива, PHP имеет несколько функций, которые позволяют вам перемещаться по массиву и просматривать текущие ключи и значения элементов.

  • end() - установить внутренний указатель массива на его последний элемент
  • reset() - установить внутренний указатель массива на его первый элемент
  • prev() - перемотка внутреннего указателя массива
  • next() - увеличить внутренний указатель массива
  • current() - вернуть текущий элемент в массив
  • key() - извлечение ключа из массива
  • each() - вернуть текущую пару ключ-значение из массива и переместить курсор массива

Эти функции работают независимо от того, является ли массив пустым, последовательным или ассоциативным, и так как массив не был указан в примере, я предположил, что он должен работать с любым массивом.

$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 
    */
}

Как вы можете видеть ожидаемый результат (false) и результат для несуществующего элемента одинаков (FALSE), поэтому вы не можете проверить, существует ли элемент, используя возвращенное значение элемента, ключ элемента отличается.

Ключ может быть либо целым числом , либо строкой . Значение может быть любым type. источник

key() возвращает значение текущего ключа, если элемент существует, в противном случае он вернет NULL. Действительный ключ никогда не может быть NULL, поэтому, если возвращается ноль, мы можем определить, что элемент не существует.

2 голосов
/ 07 января 2014
// Indexed based array
$test = array('a','b','c','d','e');
$count = count($test);
print $test[$count-2];

// Associative Array
$months = array(
         'jan'=>'January', 
         'feb' => 'february', 
         'mar' => 'March', 
         'apr' => 'April'
    );

$keys = array_keys($months);
$count = count($keys);
print $keys[$count-2];
...