Ok,

我知道所有关于array_pop(),但它删除了最后一个元素。如何获得数组的最后一个元素而不删除它?

这里有一个奖励:

$array = array('a' => 'a', 'b' => 'b', 'c' => 'c');

甚至

$array = array('a', 'b', 'c', 'd');
unset($array[2]);
echo $array[sizeof($array) - 1]; // Output: PHP Notice:  Undefined offset:  2 in - on line 4

当前回答

Array_values (array_reverse($array))[0]适用于所有这些情况。

其他回答

要获取数组的最后一个元素,使用:

$lastElement = array_slice($array, -1)[0];

基准

我迭代了1,000次,分别获取包含100个和50,000个元素的小型和大型数组的最后一个元素。

Method: $array[count($array)-1];
Small array (s): 0.000319957733154
Large array (s): 0.000526905059814
Note: Fastest!  count() must access an internal length property.
Note: This method only works if the array is naturally-keyed (0, 1, 2, ...).

Method: array_slice($array, -1)[0];
Small array (s): 0.00145292282104
Large array (s): 0.499367952347

Method: array_pop((array_slice($array, -1, 1)));
Small array (s): 0.00162816047668
Large array (s): 0.513121843338

Method: end($array);
Small array (s): 0.0028350353241
Large array (s): 4.81077480316
Note: Slowest...

我使用的是PHP 5.5.32版本。

如果你想让数组的最后一个元素在它的数组的循环中呢?

下面的代码将导致一个无限循环:

foreach ($array as $item) {
 $last_element = end($array);
 reset($array);
 if ($last_element == $item) {
   // something useful here
 }
}

对于非关联数组,解决方案显然很简单:

$last_element = $array[sizeof ($array) - 1];
foreach ($array as $key => $item) {
 if ($last_element == $item) {
   // something useful here
 }
}

上面的答案很好,但是正如@paul-van-leeuwen和@quasimodos-clone所提到的,PHP 7.3将引入两个新函数来直接解决这个问题——array_key_first()和array_key_last()。

您现在就可以通过以下polyfill(或shim)函数开始使用此语法。

// Polyfill for array_key_last() available from PHP 7.3
if (!function_exists('array_key_last')) {
  function array_key_last($array) {
    return array_slice(array_keys($array),-1)[0];
  }
}

// Polyfill for array_key_first() available from PHP 7.3
if (!function_exists('array_key_first')) {
  function array_key_first($array) {
    return array_slice(array_keys($array),0)[0];
  }
}

// Usage examples:
$first_element_key   = array_key_first($array);
$first_element_value = $array[array_key_first($array)];

$last_element_key    = array_key_last($array);
$last_element_value  = $array[array_key_last($array)];

注意:这需要PHP 5.4或更高版本。

试着结束:

$myLastElement = end($yourArray);

注意,这不仅返回传递数组的最后一个元素,它还修改了数组的内部指针,current、each、prev和next都使用了这个指针。

对于PHP >= 7.3.0:

如果使用的是PHP 7.3.0或更高版本,可以使用array_key_last,它返回数组的最后一个键,而不修改其内部指针。要得到最后一个值,你可以这样做:

$myLastElement = $yourArray[array_key_last($yourArray)];

如果你不关心修改内部指针(以下行同时支持索引数组和关联数组):

// false if empty array
$last = end($array);

// null if empty array
$last = !empty($array) ? end($array) : null;

如果你想要一个不修改内部指针的实用函数(因为数组是按值传递给函数的,所以函数对它的副本进行操作):

function array_last($array) {
    if (empty($array)) {
        return null;
    }
    return end($array);
}

不过,PHP会“动态”地生成副本,即仅在实际需要时才生成副本。当end()函数修改数组时,会在内部生成整个数组(减去一项)的副本。

因此,我会推荐下面的替代方案,它实际上更快,因为在内部它不复制数组,它只是做一个切片:

function array_last($array) {
    if (empty($array)) {
        return null;
    }
    foreach (array_slice($array, -1) as $value) {
        return $value;
    }
}

此外,“foreach / return”是一个有效获取第一项(这里是单一项)的调整。

最后,最快的替代方法,但只适用于索引数组(并且没有空格):

$last = !empty($array) ? $array[count($array)-1] : null;


为了记录,这是我的另一个答案,对于数组的第一个元素。