确定可能关联数组中的第一个键的最佳方法是什么?我的第一个想法是先遍历数组,然后立即打破它,如下所示:

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

因此,$key包含第一个键,但这似乎效率很低。有人有更好的解决方案吗?


当前回答

我认为最好和最快的方法是:

$first_key=key(array_slice($array, 0, 1, TRUE))

其他回答

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

list($firstKey) = array_keys($yourArray);

为了增强Webmut的解决方案,我添加了以下解决方案:

$firstKey = array_keys(array_slice($array, 0, 1, TRUE))[0];

我在PHP 7.1上的输出是:

foreach to get first key and value: 0.048566102981567 seconds 
reset+key to get first key and value: 0.11727809906006 seconds 
reset+key to get first key: 0.11707186698914 seconds 
array_keys to get first key: 0.53917098045349 seconds 
array_slice to get first key: 0.2494580745697 seconds 

如果对大小为10000的数组执行此操作,则结果将变为

foreach to get first key and value: 0.048488140106201 seconds 
reset+key to get first key and value: 0.12659382820129 seconds 
reset+key to get first key: 0.12248802185059 seconds 
array_slice to get first key: 0.25442600250244 seconds 

array_keys方法在30秒时超时(只有1000个元素,其余元素的计时大致相同,但array_key方法大约有7.5秒)。

一个内衬:

$array = array('key1'=>'value1','key2'=>'value2','key3'=>'key3');
echo key( array_slice( $array, 0, 1, true ) );

# echos 'key1'

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

由于OP专门询问了效率,应该指出的是,目前所有的答案实际上都比foreach的效率低得多。

我用php5.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前肢http://3v4l.org/gRoGD/perf#tabs