【发布时间】:2011-01-21 20:04:13
【问题描述】:
如何获取数组的最后一个键?
【问题讨论】:
-
应该指定关联数组、数值数组,或者如果必须同时使用两者。
-
常见问题
如何获取数组的最后一个键?
【问题讨论】:
end() 将 array 的内部指针推进到最后一个元素,并返回它的值。 key() 返回当前数组位置的索引元素。 所以,这样的一部分代码应该可以解决问题:
$array = array(
'first' => 123,
'second' => 456,
'last' => 789,
);
end($array); // move the internal pointer to the end of the array
$key = key($array); // fetches the key of the element pointed to by the internal pointer
var_dump($key);
将输出:
string 'last' (length=4)
即我的数组的最后一个元素的键。
完成此操作后,数组的内部指针将位于数组的末尾。正如 cmets 中所指出的,您可能希望在数组上运行 reset() 以使指针回到数组的开头。
【讨论】:
reset()) ;;但是您指出该功能是对的,这可能很有用。
array('a', 'b', 'c', 'd', 'a'),它将返回密钥 0 而不是 4。
虽然end() 似乎是最简单的,但并不是最快的。更快、更强大的替代方案是array_slice():
$lastKey = key(array_slice($array, -1, 1, true));
As the tests say,在一个有 500000 个元素的数组上,它几乎快了 7 倍!
【讨论】:
end($arr);$key = key($arr);reset($arr); 与 (b) $key = key(array_slice($arr,-1,1,true)); 进行比较 ...这导致 end() 更快! end() = 0.05326 秒,array_slice = 8.506 秒……嗯??
end() 最快,因为它可以从一个非常简单的 C 函数派生,例如:int top(void){ int i; for(i = 0; stack[i] != '\0'; i++); return stack[--i]; }
last。使end() 几乎是 O(1)。 :-)
自 PHP 7.3 (2018) 起(终于)有这样的功能: http://php.net/manual/en/function.array-key-last.php
$array = ['apple'=>10,'grape'=>15,'orange'=>20];
echo array_key_last ( $array )
会输出
orange
【讨论】:
我更喜欢
end(array_keys($myarr))
【讨论】:
end((array_keys($myarr))) 绕过通知。
只需使用:echo $array[count($array) - 1];
【讨论】:
int top(void){ int i; for(i = 0; stack[i] != '\0'; i++); return stack[--i]; } 后用于 assoc,这很有趣,但在您的时间预算有限时对业务不利
$a[1] = 1; $a[5] = 5; $a[0] = 0; 然后您将拥有一个包含键 (1, 5, 0) 的数组,按此顺序。 count($a) 将产生 3 并且 $a[2] 未定义。它当然不会给你 5 个回报。
不知道这是否会更快,但这样做似乎更容易,并且通过不将函数传递给 end() 来避免错误...
它只需要一个变量......再写一行代码没什么大不了的,然后如果需要,可以取消设置。
$array = array(
'first' => 123,
'second' => 456,
'last' => 789,
);
$keys = array_keys($array);
$last = end($keys);
【讨论】:
从 PHP7.3 开始,您可以使用 array_key_last() 直接访问数组(外层)中的最后一个键
最终将本页上的大部分辩论搁置一旁。它无疑是表现最好的,没有副作用,并且是一种直接、直观、单次调用的技术,可以准确地提供这个问题所寻求的内容。
一个粗略的基准作为证明:https://3v4l.org/hO1Yf
array_slice() + key(): 1.4 end() + key(): 13.7 array_key_last(): 0.00015*test 数组包含 500000 个元素,microtime 重复 100 次然后平均然后乘以 1000 以避免科学记数法。感谢@MAChitgarha 为the initial benchmark 在@TadejMagajna's answer 下发表评论。
这意味着您可以检索最终键的值,而无需:
这个函数早就应该出现了,它是数组函数工具带的一个受欢迎的补充,它可以提高性能、避免不必要的副作用,并启用干净/直接/直观的代码。
这是demo:
$array = ["a" => "one", "b" => "two", "c" => "three"];
if (!function_exists('array_key_last')) {
echo "please upgrade to php7.3";
} else {
echo "First Key: " , key($array) , "\n";
echo "Last Key: " , array_key_last($array) , "\n";
next($array); // move array pointer to second element
echo "Second Key: " , key($array) , "\n";
echo "Still Last Key: " , array_key_last($array);
}
输出:
First Key: a
Last Key: c // <-- unaffected by the pointer position, NICE!
Second Key: b
Last Key: c // <-- unaffected by the pointer position, NICE!
一些注意事项:
array_key_last() 是 array_key_first() 的兄弟函数。null。array_value_first() & array_value_last()) 也可以提供对书挡元素的无指针访问,但它们显然未能获得足够的票数来实现。以下是一些讨论新功能的相关页面:
附言如果有人在权衡其他一些技术,您可以参考这个小的比较集合:(Demo)
Duration of array_slice() + key(): 0.35353660583496 Duration of end() + key(): 6.7495584487915 Duration of array_key_last(): 0.00025749206542969 Duration of array_keys() + end(): 7.6123380661011 Duration of array_reverse() + key(): 6.7875385284424 Duration of array_slice() + foreach(): 0.28870105743408
【讨论】:
截至 PHP >= 7.3 array_key_last() 是获取任何数组的最后一个键的最佳方式。使用end()、key() 和reset() 的组合来获取数组的最后一个键是离谱的。
$array = array("one" => bird, "two" => "fish", 3 => "elephant");
$key = array_key_last($array);
var_dump($key) //output 3
比较一下
end($array)
$key = key($array)
var_dump($key) //output 3
reset($array)
如果您使用end() 和key() 的组合,则必须重置数组以使指针位于开头
【讨论】:
尝试使用array_pop和array_keys函数如下:
<?php
$array = array(
'one' => 1,
'two' => 2,
'three' => 3
);
echo array_pop(array_keys($array)); // prints three
?>
【讨论】:
array_pop() 对 array_keys() 的返回值进行操作,而 not 对原始数组进行操作。
很奇怪,为什么这个话题没有这个答案:
$lastKey = array_keys($array)[count($array)-1];
【讨论】:
我还想为这个问题提供一个替代解决方案。
假设你所有的键都是数字的,没有任何间隙, 我的首选方法是对数组进行计数,然后从该值中减去 1(以说明数组键从 0 开始的事实。
$array = array(0=>'dog', 1=>'cat');
$lastKey = count($array)-1;
$lastKeyValue = $array[$lastKey];
var_dump($lastKey);
print_r($lastKeyValue);
这会给你:
int(1) 猫
【讨论】:
你可以用这个:
$array = array("one" => "apple", "two" => "orange", "three" => "pear");
end($array);
echo key($array);
另一种解决方案是创建一个函数并使用它:
function endKey($array){
end($array);
return key($array);
}
$array = array("one" => "apple", "two" => "orange", "three" => "pear");
echo endKey($array);
【讨论】:
$arr = array('key1'=>'value1','key2'=>'value2','key3'=>'value3');
list($last_key) = each(array_reverse($arr));
print $last_key;
// key3
【讨论】:
我刚刚从 Xander 那里获取了帮助函数,并用之前的答案对其进行了改进:
function last($array){
$keys = array_keys($array);
return end($keys);
}
$arr = array("one" => "apple", "two" => "orange", "three" => "pear");
echo last($arr);
echo $arr(last($arr));
【讨论】:
用array_reverse() 试试这个。
$arr = array(
'first' => 01,
'second' => 10,
'third' => 20,
);
$key = key(array_reverse($arr));
var_dump($key);
【讨论】:
或在php >= 7.3.0
你可以使用函数array_key_last()
如 php.net 中所述——获取数组的最后一个键
【讨论】:
如果数组是数组, 那么最后一个键是
last_key = array[array.length-1]
【讨论】:
$array = array(
'something' => array(1,2,3),
'somethingelse' => array(1,2,3,4)
);
$last_value = end($array);
$last_key = key($array); // 'somethingelse'
这是可行的,因为 PHP 在内部为 $array 移动了它的数组指针
【讨论】:
也可以内联使用的最佳解决方案:
end($arr) && false ?: key($arr)
此解决方案仅是表达式/语句,提供的不是最好的性能。
内联示例用法:
$obj->setValue(
end($arr) && false ?: key($arr) // last $arr key
);
更新:在 PHP 7.3+ 中:使用(当然)新添加的 array_key_last() 方法。
【讨论】:
尝试这样做以保持与旧版本 PHP 的兼容性:
$array_keys = array_keys( $array );
$last_item_key = array_pop( $array_keys );
【讨论】: