在(可能)关联数组中获取第一个键?
确定可能的关联数组中的第一个键的最好方法是什么? 我首先想到的仅仅是对数组进行foreach,然后立即将其分解,如下所示:
foreach ($an_array as $key => $val) break;
因此让$ key包含第一个键,但这看起来效率低下。 有没有人有更好的解决方案?
您可以使用reset
和key
:
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
上一篇: Get first key in a (possibly) associative array?
下一篇: How to calculate the difference between two dates using PHP?