首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP end() 取得陣列最後一個元素:指標移動與配合 key()/current()

     編輯:PHP 相關知識

PHP end() 取得陣列最後一個元素完整指南

`end()` 將陣列內部指標移至**最後一個元素**並返回其**值**;`reset()` 移至第一個。本文說明語法、指標操作、配合 `key()`/`current()` 取得鍵值、常見陷阱與替代方案。

函數語法

mixed end ( array &$array )

成功返回最後元素值,陣列為空返回 `false`。直接修改原陣列指標。

基本範例

<?php
$users = ['baidu.com', 'haosou.com', 'sina.com', 'jb51.net'];
echo end($users); // jb51.net

// 配合 key() 取得鍵名
end($users);
echo key($users); // 3 (數字索引)

$assoc = ['a' => 1, 'b' => 2, 'c' => 3];
end($assoc);
echo key($assoc); // 'c'
echo current($assoc); // 3
?>

陣列指標操作函數族

函數指標移動返回值
reset()第一個元素第一個元素值
end()最後一個元素最後一個元素值
next()下一個下一個元素值
prev()上一個上一個元素值
current()不移動當前元素值
key()不移動當前元素鍵名
each()下一個[key, value] 陣列 (PHP 7.2 棄用)

遍歷陣列的現代寫法(不依賴指標)

<?php
$arr = ['a', 'b', 'c'];

// foreach (推薦)
foreach ($arr as $k => $v) { ... }

// array_* 函數族
array_walk($arr, fn($v, $k) => ...);
array_map(fn($v) => ..., $arr);
array_filter($arr, fn($v) => ...);
array_reduce($arr, fn($carry, $v) => ..., $initial);

// 只需最後元素
$last = $arr[count($arr) - 1];           // 索引陣列
$last = array_values($arr)[count($arr)-1]; // 關聯陣列取值
$last = array_pop($arr);                 // 會移除元素(副作用)
$last = end($arr);                       // 不移除,但移動指標
?>

常見陷阱

  1. 指標副作用:`end()` 後再 `foreach` 會從頭開始(foreach 重置指標),但 `while(list($k,$v)=each($arr))` 會從末尾繼續(已棄用)。
  2. 傳值而非傳址:`end($arr)` 必須傳變量,`end(['a','b'])` 報錯 "Only variables should be passed by reference"。
  3. 空陣列返回 false**:`if (end($empty))` 會誤判,需 `if (($last = end($arr)) !== false)`。
  4. 多維陣列只影響第一層**:`end($multi)` 移動外層指標,內層指標不變。

替代方案:不移動指標取得最後元素

// 索引陣列
$last = $arr[count($arr) - 1] ?? null;

// 關聯陣列(取值)
$last = array_values($arr)[count($arr) - 1] ?? null;

// 關聯陣列(取鍵值)
$keys = array_keys($arr);
$lastKey = $keys[count($keys) - 1] ?? null;
$lastVal = $arr[$lastKey] ?? null;

// PHP 7.3+ array_key_last()
$lastKey = array_key_last($arr);
$lastVal = $arr[$lastKey] ?? null;

實際應用場景

  • 取得最新日誌/記錄:`end($logs)`
  • 檢查最後錯誤:`end($errors)`
  • 堆疊實作:`end($stack)` 窺視棧頂
  • 瀏覽歷史:`end($history)` 當前頁
  • 配合 `prev()` 反向遍歷:`end($arr); while($v=current($arr)) { ...; prev($arr); }`

效能提示

  • `end()` / `reset()` 為 O(1) 直接跳轉指標,極快。
  • 頻繁指標操作不如 `foreach` / `array_*` 函數可讀、優化友好。
  • 大陣列只需最後元素時,`array_key_last()` / `count()` 方案無副作用更佳。

理解 `end()` 移動指標的副作用,並在現代代碼中優先使用無副作用的替代方案,能寫出更健壯的陣列處理邏輯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved