值得注意的是,當以無特定順序的數字鍵值建立陣列時,end() 仍然只會傳回最後建立的值。因此,如果您有以下程式碼:
<?php
$a = array();
$a[1] = 1;
$a[0] = 0;
echo end($a);
?>
這將會印出「0」。
(PHP 4, PHP 5, PHP 7, PHP 8)
end — 將陣列的內部指標設定為其最後一個元素
array
陣列。此陣列是透過參考傳遞的,因為它會被函式修改。這表示您必須傳遞一個實際的變數,而不是返回陣列的函式,因為只有實際的變數才能透過參考傳遞。
返回最後一個元素的值,如果陣列為空,則返回 false
。
版本 | 說明 |
---|---|
8.1.0 | 在物件上呼叫此函式已被棄用。請先使用 get_mangled_object_vars() 將物件轉換為陣列,或者使用實作 Iterator 介面的類別所提供的方法,例如 ArrayIterator。 |
7.4.0 | SPL 類別的實例現在會被視為沒有屬性的空物件,而不是呼叫與此函式同名的 Iterator 方法。 |
範例 #1 end() 範例
<?php
$fruits = array('apple', 'banana', 'cranberry');
echo end($fruits); // cranberry
?>
值得注意的是,當以無特定順序的數字鍵值建立陣列時,end() 仍然只會傳回最後建立的值。因此,如果您有以下程式碼:
<?php
$a = array();
$a[1] = 1;
$a[0] = 0;
echo end($a);
?>
這將會印出「0」。
這個函式會回傳陣列結尾的值,但有時您可能對陣列結尾的鍵感興趣,尤其是在處理非整數索引的陣列時。
<?php
// 回傳陣列結尾的鍵
function endKey($array){
end($array);
return key($array);
}
?>
使用範例
<?php
$a = array("one" => "apple", "two" => "orange", "three" => "pear");
echo endKey($a); // 將會輸出 "three"
?>
如果您只想取得陣列的最後一個項目,而不影響內部陣列指標,只需執行以下操作
<?php
function endc( $array ) { return end( $array ); }
$items = array( 'one', 'two', 'three' );
$lastItem = endc( $items ); // three
$current = current( $items ); // one
?>
這是可行的,因為傳遞給函式的參數是副本,而不是原始變數的參考。
如果您需要取得陣列第一個或最後一個元素的參考,請使用這些函式,因為 reset() 和 end() 只會回傳副本,而您無法直接對其進行解除參考。
<?php
function first(&$array) {
if (!is_array($array)) return &$array;
if (!count($array)) return null;
reset($array);
return &$array[key($array)];
}
function last(&$array) {
if (!is_array($array)) return &$array;
if (!count($array)) return null;
end($array);
return &$array[key($array)];
}
?>
我發現 end() 函式最適合用來取得檔案名稱的副檔名。這個函式會清除反斜線並取得檔案的副檔名。
<?php
private function extension($str){
$str=implode("",explode("\\",$str));
$str=explode(".",$str);
$str=strtolower(end($str));
return $str;
}
// 範例:
$file='name-Of_soMe.File.txt';
echo extension($file); // txt
?>
非常簡單。
請注意,從 5.0.4 版到 5.0.5 版,這個函式現在接受一個陣列作為參數。這可能會破壞一些程式碼,例如:
<?php
echo ">> ".end(array_keys(array('x' => 'y')))."\n";
?>
在 5.0.4 版或更早版本中,這會回傳「致命錯誤:只能傳遞變數的參照」,但在 5.0.5 版則不會。
如果您在巢狀函式呼叫中遇到這個問題,一個簡單的解決方法是將 array_keys(或其他函式)的結果指派給一個中間變數。
<?php
$x = array_keys(array('x' => 'y'));
echo ">> ".end($x)."\n";
?>
$filename = 'somefile.jpg';
PHP v5.4 不支援以下語法:
echo end(explode(".", $filename)); // 返回 jpg 字串
必須拆成兩個敘述:
$file = explode(".", $filename);
echo end ($file);
嘗試透過 end() 從空陣列取得鍵值將會回傳 NULL,而不是拋出錯誤或警告,因為在空陣列上使用 end() 會得到 false。
<?php
$a = ['a' => ['hello' => 'a1','world' => 'a2'],
'b' => ['hello' => 'b1','world' => 'b2'],
'c' => ['hello' => 'c1','world' => 'c2']
];
$b = [];
var_dump(end($a)['hello']);
var_dump(end($b)['hello']);
var_dump(false['hello']);
?>
結果:
字串(2) "c1"
NULL
NULL
請注意,end() 並不會遞迴地將多維陣列的指標設定到結尾。
參考以下範例:
<?php
// 建立測試用的陣列
$a = array();
$i = 0;
while($i++ < 3){
$a[] = array(dechex(crc32(mt_rand())),dechex(crc32('lol'.mt_rand())));
}
// 顯示陣列結構
echo '<pre>';var_dump($a);
// 將 $a 的指標設定到最後一個元素
end($a);
// 取得 $a 的目前元素
var_dump(current($a));
// 取得 $a 目前元素的目前元素
var_dump(current(current($a)));
?>
你可能會注意到你得到的結果類似這樣
array(3) {
[0]=>
array(2) {
[0]=>
string(8) "764d8d20"
[1]=>
string(8) "85ee186d"
}
[1]=>
array(2) {
[0]=>
string(8) "c8c72466"
[1]=>
string(8) "a0fdccb2"
}
[2]=>
array(2) {
[0]=>
string(8) "3463a31b"
[1]=>
string(8) "589f6b63"
}
}
array(2) {
[0]=>
string(8) "3463a31b"
[1]=>
string(8) "589f6b63"
}
string(8) "3463a31b"
陣列元素的指標仍然在第一個元素上,如同 current() 的行為。所以要注意這點。