提问



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


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


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

最佳参考


您可以使用resetkey:[49] [50]


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


它与您的初始代码基本相同,但开销较少,而且发生的事情更为明显。


只记得调用reset,或者你可以获得数组中的任何键。您也可以使用end代替reset来获取最后一个键。[51]


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


$first_value = reset($array);


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


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

其它参考1


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

其它参考2


有趣的是,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[52] [53]

其它参考3


key($an_array)会给你第一把钥匙


每个Blixt编辑:你应该在key($an_array)之前调用reset($array);来重置指向数组开头的指针。

其它参考4


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

其它参考5


如果效率对您来说不重要,可以在PHP 5.4(及更高版本)中使用array_keys($yourArray)[0]


实施例


# 1
$arr = ["my" => "test", "is" => "best"];    
echo array_keys($arr)[0] . "\r\n"; // prints "my"


# 2
$arr = ["test", "best"];
echo array_keys($arr)[0] . "\r\n"; // prints "0"

# 3
$arr = [1 => "test", 2 => "best"];
echo array_keys($arr)[0] . "\r\n"; // prints "1"


解决方案的优势:


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


是你可以将array_keys($arr)[0]作为函数参数传递(即doSomething(array_keys($arr)[0], $otherParameter))。


HTH

其它参考6


你可以试试


array_keys($data)[0]

其它参考7


$myArray = array(
    2 => '3th element',
    4 => 'first element',
    1 => 'second element',
    3 => '4th element'
);
echo min(array_keys($myArray)); // return 1

其它参考8


请找到以下内容:


$yourArray = array('first_key'=> 'First', 2, 3, 4, 5);
$keys   =   array_keys($yourArray);
echo "Key = ".$keys[0];


我认为这会奏效。

其它参考9


这也可以是一种解决方案。


$first_key = current(array_flip($array));


我测试了它,它的工作原理。

其它参考10


 $arr = array('key1'=>'value1','key2'=>'value2','key3'=>'key3');
 list($first_key) = each($arr);
 print $first_key;
 // key1

其它参考11


为了增强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_keys方法大约需要7.5秒)。

其它参考12


对我有用的最佳方式是


array_shift(array_keys($array))


array_keys从初始数组获取键数组,然后array_shift从第一个元素值中删除它。
你需要PHP 5.4+。

其它参考13


这是我找到的更简单的方法。快速而且只有两行代码:-D


$keys = array_keys($array);
echo $array[$keys[0]];

其它参考14


单行:


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

# echos 'key1'

其它参考15


今天我不得不搜索POST请求返回的数组的第一个键。 (并注意表单ID的编号等)


好吧,我发现了这个:
在PHP 中返回关联数组的第一个键


http://php.net/key[56]


我已经完成了这项工作。


    $data = $request->request->all();
    dump($data);
    while ($test = current($data)) {
        dump($test);
        echo key($data).'<br />';die();
        break;
    }


也许它会生态15分钟的另一个人。
CYA。

其它参考16


一个更通用且安全的版本,具有空的可迭代/数组的回退:



  注意:假设$数组是arrayiterable(PHP>=7.1)



$array = [/* ... */]; // my array or iterable

// these lines are a fallback for the case nothing is found
$firstKey = null; // null or default value of your choice
$firstValue = null; // null or default value of your choice

// iterating the array
foreach ($array as $firstKey => $firstValue) {
    // stop after first iteration
    break;
}


TLDR:这样你就不需要仔细检查iterable。(在这种情况下是数组)。


Foreach是迭代所有内容的最快方法。


建议和解释:
我建议在迭代之前设置$firstKey$firstValue的默认值,这样就可以知道数组是否为空。



  注意:如果您依赖于始终填充数组,则不需要默认值。 (但要100%肯定!)



更高级的东西的解释:


如果你的iterable有自定义Iterator,你可能需要在foreach语句之后手动重置它。


关于PHP的更多信息:iterables [57]

其它参考17


你可以玩你的阵列


$daysArray = array('Monday', 'Tuesday', 'Sunday');
$day = current($transport); // $day = 'Monday';
$day = next($transport);    // $day = 'Tuesday';
$day = current($transport); // $day = 'Tuesday';
$day = prev($transport);    // $day = 'Monday';
$day = end($transport);     // $day = 'Sunday';
$day = current($transport); // $day = 'Sunday';


要获得数组的第一个元素,您可以使用current,对于最后一个元素,您可以使用end


修改


只是为了不再获得答案的答案,您可以使用array_keys将键转换为值,并使用如上所示。