如何获取数组中的最后一个键?

Posted

技术标签:

【中文标题】如何获取数组中的最后一个键?【英文标题】:How to get last key in an array? 【发布时间】:2011-01-21 20:04:13 【问题描述】:

如何获取数组的最后一个键?

【问题讨论】:

应该指定关联数组、数值数组,或者如果必须同时使用两者。 常见问题 【参考方案1】:

一种解决方案是使用endkey 的组合(引用)

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() 以使指针回到数组的开头。

【讨论】:

@Pim :取决于 OP 在 之后想要对该数组做什么(可能不需要调用 reset() ;;但是您指出该功能是对的,这可能很有用。 @PascalMARTIN +1 我认为在您的答案中添加有关 reset() 的评论会非常有帮助。 如果数组有重复值,此方法不起作用。例如。对于array('a', 'b', 'c', 'd', 'a'),它将返回密钥 0 而不是 4。 @Marc 即使有重复值,这种方法也能正常工作。 @pppp 它不起作用,因为...检查 end() 返回的内容,然后再想一想;)【参考方案2】:

虽然end() 似乎是最简单的,但并不是最快的。更快、更强大的替代方案是array_slice()

$lastKey = key(array_slice($array, -1, 1, true));

As the tests say,在一个有 500000 个元素的数组上,它几乎快了 7 倍!

【讨论】:

对这个答案感到兴奋,我对 100,000 次迭代进行了快速测试,将 (a) end($arr);$key = key($arr);reset($arr); 与 (b) $key = key(array_slice($arr,-1,1,true)); 进行比较 ...这导致 end() 更快! end() = 0.05326 秒,array_slice = 8.506 秒……嗯?? php 的内置函数是由极端的书呆子构建的。不要尝试重新创建这些功能。很有可能你制作的东西比原来的要慢得多。当然,除非你是某种邪恶的巫师。 end() 最快,因为它可以从一个非常简单的 C 函数派生,例如:int top(void) int i; for(i = 0; stack[i] != '\0'; i++); return stack[--i]; @Gustav 我相信 PHP 的底层 C 实现,实际上有一个指向最后一个元素的内部指针 last。使end() 几乎是 O(1)。 :-) @dmmd,我相信 PHP 团队会非常高兴他们被称为书呆子。【参考方案3】:

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

【讨论】:

万岁!我正要添加这个答案。您能否突出显示“PHP 7.3”版本和 2018 年?其他人会更容易发现这个好消息 另外值得一提的是,这不会影响内部数组指针。【参考方案4】:

我更喜欢

end(array_keys($myarr))

【讨论】:

引起严格注意,end 需要一个变量引用 您可以使用end((array_keys($myarr))) 绕过通知。 @BenFortune 这已在 PHP7 中得到修复:“在 PHP 5 中,当函数参数通过引用传递时,在函数参数周围使用冗余括号可以消除严格的标准警告。现在将始终发出警告。” 这是一个完全没有必要的警告!这是所有其他语言的正常和常见的东西! 在其他语言中,函数不对指针进行操作,是吗?【参考方案5】:

只需使用: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 个回报。 再次阅读问题“如何获取数组中的最后一个?”【参考方案6】:

不知道这是否会更快,但这样做似乎更容易,并且通过不将函数传递给 end() 来避免错误...

它只需要一个变量......再写一行代码没什么大不了的,然后如果需要,可以取消设置。

$array = array(
    'first' => 123,
    'second' => 456,
    'last' => 789, 
);

$keys = array_keys($array);
$last = end($keys);

【讨论】:

这个答案(虽然在技术上是正确的)是浪费/低效的,因为它需要创建一个额外的数组(与原始数组等长)。这意味着浪费会随着原始阵列的增加而增加。永远不应该选择 Pascal MARTIN 的有效答案。我很惊讶这有这么多的赞成票。【参考方案7】:

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()) 也可以提供对书挡元素的无指针访问,但它们显然未能获得足够的票数来实现。

以下是一些讨论新功能的相关页面:

https://laravel-news.com/outer-array-functions-php-7-3 https://kinsta.com/blog/php-7-3/#array-key-first-last https://wiki.php.net/rfc/array_key_first_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

【讨论】:

这个答案应该在列表的顶部。就完成了。 哇,我这个答案的 DV?怎么回事,太全面/确定/解释/支持?噗。敢于举报的帖子,绝对要继续推下去。好工作。如果您不知道,DV 按钮用于“无用”的帖子。请问问自己你的目标是什么。【参考方案8】:

截至 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() 的组合,则必须重置数组以使指针位于开头

【讨论】:

【参考方案9】:

尝试使用array_pop和array_keys函数如下:

<?php

$array = array(
    'one' => 1,
    'two' => 2,
    'three' => 3
);

echo array_pop(array_keys($array)); // prints three

?>

【讨论】:

如果你的数组中有超过 1 个东西,这真的很慢。请不要这样做。 并引起严格注意,变量引用 array_pop() 会缩短原始数组(删除最后一个元素)。我不确定这对 OP 是否重要,但对其他人肯定很重要。 并非如此。在此示例中,array_pop()array_keys() 的返回值进行操作,而 not 对原始数组进行操作。 因为还有其他更有效的答案不会触发通知,所以我不赞成这个答案。【参考方案10】:

很奇怪,为什么这个话题没有这个答案:

$lastKey = array_keys($array)[count($array)-1];

【讨论】:

【参考方案11】:

我还想为这个问题提供一个替代解决方案。

假设你所有的键都是数字的,没有任何间隙, 我的首选方法是对数组进行计数,然后从该值中减去 1(以说明数组键从 0 开始的事实。

$array = array(0=>'dog', 1=>'cat');

$lastKey = count($array)-1;
$lastKeyValue = $array[$lastKey];

var_dump($lastKey);
print_r($lastKeyValue);

这会给你:

int(1) 猫

【讨论】:

这不适用于键不是增量的数组,例如数组(0=>'狗',5=>'猫'); $lastKey 会返回错误的值 @kakoma - 正如我的帖子所说“假设你所有的键都是数字,没有任何间隙”。 对于任何想知道使用 PHP 的“array_values”将数组重新设置为数字顺序的人。 php.net/manual/en/function.array-values.php 因为这个答案只处理数组可能性的一小部分(数字、连续键控数组),所以这个答案不能为 OP 的广义问题提供一个可靠/正确的答案。投反对票。【参考方案12】:

你可以用这个:

$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);

【讨论】:

这个答案没有提供这个线程中没有的新内容。 马丁,没有人使用函数来获取结果。 你需要在函数中添加1行代码吗?这是一个相当不必要的界面。 马丁,哪一行。 函数中的行【参考方案13】:
$arr = array('key1'=>'value1','key2'=>'value2','key3'=>'value3');
list($last_key) = each(array_reverse($arr));
print $last_key;
// key3

【讨论】:

反转整个数组以提取一个值肯定比 PascalMARTIN 的方法效率低。尽管它在技术上是正确的,但绝不应该用它来代替 Pascal 的方法。【参考方案14】:

我刚刚从 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));

【讨论】:

【参考方案15】:

array_reverse() 试试这个。

 $arr = array(
     'first' => 01,
     'second' => 10,
     'third' => 20, 
 );  
 $key = key(array_reverse($arr));
 var_dump($key);

【讨论】:

【参考方案16】:

或在php &gt;= 7.3.0

你可以使用函数array_key_last()

如 php.net 中所述——获取数组的最后一个键

https://www.php.net/manual/en/function.array-key-last.php

【讨论】:

【参考方案17】:

如果数组是数组, 那么最后一个键是

last_key = array[array.length-1]

【讨论】:

【参考方案18】:
$array = array(
    'something' => array(1,2,3),
    'somethingelse' => array(1,2,3,4)
);

$last_value = end($array);
$last_key = key($array); // 'somethingelse'

这是可行的,因为 PHP 在内部为 $array 移动了它的数组指针

【讨论】:

这是 PascalMARTIN 方法的复制品。请保留此页面并删除您迟到/重复的答案。投反对票。【参考方案19】:

也可以内联使用的最佳解决方案:

end($arr) && false ?: key($arr)

此解决方案仅是表达式/语句,提供的不是最好的性能。

内联示例用法:

$obj->setValue(
    end($arr) && false ?: key($arr) // last $arr key
);

更新:在 PHP 7.3+ 中:使用(当然)新添加的 array_key_last() 方法。

【讨论】:

【参考方案20】:

尝试这样做以保持与旧版本 PHP 的兼容性:

$array_keys    = array_keys( $array );
$last_item_key = array_pop( $array_keys );

【讨论】:

以上是关于如何获取数组中的最后一个键?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据ios中的特定键从数组中获取字典

如何根据对象数组中的键获取值javascript

如何使用 jQuery 获取数组键?

如何获取 BTreeMap 中的最后一项?

如何从打字稿中的数组中获取键[重复]

如何在java中获取数组中的第一个和最后一个元素?