在(可能)关联数组中获取第一个键?

确定可能的关联数组中的第一个键的最好方法是什么? 我首先想到的仅仅是对数组进行foreach,然后立即将其分解,如下所示:

foreach ($an_array as $key => $val) break;

因此让$ key包含第一个键,但这看起来效率低下。 有没有人有更好的解决方案?


您可以使用resetkey

reset($array);
$first_key = key($array);

它基本上和你最初的代码一样,但是开销少一点,而且更明显的是发生了什么。

只需记住调用reset ,或者您可以获得阵列中的任何键。 您也可以使用end而不是reset来获取最后一个键。

如果你想让键获得第一个值, reset实际上会返回它:

$first_value = reset($array);

有一个特殊情况需要注意(首先检查数组的长度):

$arr1 = array(false);
$arr2 = array();
var_dump(reset($arr1) === reset($arr2)); // bool(true)

array_keys返回一个键数组。 采取第一项。 或者,您可以调用阵列上的reset ,然后key 。 后一种方法可能稍微快一点(虽然我没有测试它),但它具有重置内部指针的副作用。


有趣的是,foreach循环实际上是最有效的方法。

由于OP特别询问了效率问题,应该指出的是,所有当前的答案实际上比foreach效率低得多。

我在php 5.4上做了一个基准测试,重置/键指针方法(接受的答案)似乎比foreach慢大约7倍。 操纵整个数组的其他方法(array_keys,array_flip)显然比这更慢,并且在处理大型数组时变得糟糕。

Foreach并不是无效的,随时可以使用它!

编辑2015-03-03:

基准脚本已经被要求,我没有原始脚本,而是做了一些新的测试。 这次我发现foreach只有reset / key的两倍。 我使用了一个100键的数组,并运行每种方法一百万次以获得一些明显的差异,下面是简单基准的代码:

$array = [];
for($i=0; $i < 100; $i++)
    $array["key$i"] = $i;

for($i=0, $start = microtime(true); $i < 1000000; $i++) {
    foreach ($array as $firstKey => $firstValue) {
        break;
    }
}
echo "foreach to get first key and value: " . (microtime(true) - $start) . " seconds <br />";

for($i=0, $start = microtime(true); $i < 1000000; $i++) {
    $firstValue = reset($array);
    $firstKey = key($array);
}
echo "reset+key to get first key and value: " . (microtime(true) - $start) . " seconds <br />";

for($i=0, $start = microtime(true); $i < 1000000; $i++) {
    reset($array);
    $firstKey = key($array);
}
echo "reset+key to get first key: " . (microtime(true) - $start) . " seconds <br />";


for($i=0, $start = microtime(true); $i < 1000000; $i++) {
    $firstKey = array_keys($array)[0];
}
echo "array_keys to get first key: " . (microtime(true) - $start) . " seconds <br />";

在我的php 5.5中输出:

foreach to get first key and value: 0.15501809120178 seconds 
reset+key to get first key and value: 0.29375791549683 seconds 
reset+key to get first key: 0.26421809196472 seconds 
array_keys to get first key: 10.059751987457 seconds

重置+密钥http://3v4l.org/b4DrN/perf#tabs
foreach http://3v4l.org/gRoGD/perf#tabs

链接地址: http://www.djcxy.com/p/5101.html

上一篇: Get first key in a (possibly) associative array?

下一篇: How do you remove an array element in a foreach loop?