有趣的是,当以没有特定顺序的数字键创建数组时,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
私有函数 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 5.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']);
?>
结果是
string(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` 函数返回第一个元素。所以请注意这一点。