有趣的是,当以无特定顺序创建具有数字键的数组时,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 | 在 object 上调用此函数已弃用。您可以先使用 get_mangled_object_vars() 将 object 转换为 array,或者使用实现 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']);
?>
结果是
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 指向它。所以请注意这一点。
<?php
$A=[1];
print_r($A);
end($A[5]);
print_r($A);
?>
Array
(
[0] => 1
)
Array
(
[0] => 1
[5] =>
)
在向数组添加元素时,可能需要了解添加元素所使用的键。仅仅添加元素不会改变数组中的当前位置,因此调用 key() 不会返回正确的键值;您必须先定位到数组的末尾 end()。
<?php
function array_add(&$array, $value) {
$array[] = $value; // 添加元素
end($array); // 重要!
return key($array);
}
?>
这是一个将数组中的项目向上或向下移动的函数。它通过将数组分解成两个独立的数组来实现,然后循环创建最终的数组,并在计数器等于我们确定的新位置时添加我们要移动的项目。数组键、位置和方向是通过查询字符串传递的。
<?php
// 参数
//$array - 您要修改的数组
//$keytomove - 要移动的项的键
//$pos - 项目的当前位置:使用 count($array) 函数
// 然后循环使用递增的整数将位置添加到上 // 或下按钮
//$dir - 您要移动的方向 - "up"/"dn"
function change_pos($array, $keytomove, $pos, $dir){
// 统计原始行数
$count = count($array);
// 设置我们将用来放置移动项目的整数
if($dir=="up"){
if($pos==1){
// 如果项目已经是第一个,并且我们尝试向上移动它
// 我们将其发送到数组的末尾
$change = $count;
}else{
// 在其他任何地方,它只是向后移动一个,更靠近数组的开头
$change = $pos-1;
}
}
// 对下按钮执行相同的操作
if($dir=="dn"){
if($pos==$count){
$change = 1;
}else{
$change = $pos+1;
}
}
// 复制要移动的元素
$move = $array[$keytomove];
// 从主数组中删除原始元素
unset($array[$keytomove]);
// 创建一个我们未移动的值的名称数组
// 正在移动
$preint = 1;
foreach($array as $c){
$notmoved["{$preint}"] = $c['name'];
$preint++;
}
// 循环遍历所有元素
$int = 1;
while($int<=$count){
// 动态更改未移动项目的键,因为我们递增计数器
$notmovedkey = $notmoved["$int"];
// 当计数器等于我们想要的位置时
// 放置移动的条目,我们将其放入一个新数组中
if($int==$change){
$neworder["{$keytomove}"] = $move;
}
// 如果未满足位置号,则添加所有其他数组项,并且
// 在写入移动项后恢复添加它们
if($contkey!=""){
$neworder["{$notmovedkey}"] = $array["{$notmovedkey}"];
}
$int++;
}
return($neworder);
}
?>
这不太优雅,但它有效。
我发现使用 pathinfo 在获取文件的扩展名方面非常有用。
<? Php
$filename = dictionary.txt;
$ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION)) ;
echo $ext; // txt
?>
要获取第一个元素
// 获取第一个项目。
foreach ($array as $item) {
$first = $item;
break;
}
// $first 将包含第一个元素。