关于php:获取(可能)关联数组中的第一个键?

Get first key in a (possibly) associative array?

确定可能关联数组中的第一个键的最佳方法是什么?我的第一个想法是在数组前面,然后立即将其破坏,如下所示:

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

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


2019更新

从php 7.3开始,有一个名为array_key_first()的新内置函数,它可以从给定数组中检索第一个键,而不必重置内部指针。查看文档了解更多信息。

您可以使用resetkey

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

它本质上与您的初始代码相同,但是开销稍微少一点,而且更明显的是发生了什么。

只需记住调用reset,否则您可能会得到数组中的任何键。您也可以使用end而不是reset来获取最后一个密钥。

如果您希望键获得第一个值,那么reset实际上会返回它:

1
$first_value = reset($array);

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

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


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


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

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

我用php 5.4做了一个基准测试,reset/key指针方法(接受的答案)看起来比foreach慢7倍。其他处理整个数组的方法(数组键、数组翻转)明显比这还要慢,并且在处理大型数组时会变得更糟。

foreach一点效率都不低,请随意使用它!

编辑2015-03-03:

已经请求了基准脚本,我没有原始脚本,而是进行了一些新的测试。这次我发现前臂的速度只有重置/键的两倍。我使用了一个100键数组,并对每个方法运行了一百万次,以获得一些显著的差异,下面是简单基准测试的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$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上,这个输出:

10

重置+键http://3v4l.org/b4drn/perf_tabsforeach http://3v4l.org/grogd/perf标签


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

编辑每一个文本:您应该在key($an_array)之前调用reset($array);,将指针重置到数组的开头。


你可以试试

1
array_keys($data)[0]

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


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

实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 1
$arr = ["my" =>"test","is" =>"best"];    
echo array_keys($arr)[0] ."

"
; // prints"my"


# 2
$arr = ["test","best"];
echo array_keys($arr)[0] ."

"
; // prints"0"

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

"
; // prints"1"

相对于解决方案的优势:

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

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

高温高压


2018 +从php 7.3开始,有一个array_key_first()函数可以实现这一点:

1
2
$array = ['foo' => 'lorem', 'bar' => 'ipsum'];
$firstKey = array_key_first($array); // 'foo'

此处提供文档。???


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


请查找以下内容:

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

工作示例:


这也可能是一个解决方案。

1
2
3
$yourArray = array('first_key'=> 'First', 2, 3, 4, 5);
$first_key = current(array_flip($yourArray));
echo $first_key;

我已经测试过了,它能工作。

工作代码:


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

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

php 7.1上我的输出是:

1
2
3
4
5
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的数组执行此操作,则结果将变为

1
2
3
4
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

数组键方法在30秒时超时(只有1000个元素,其余元素的计时大致相同,但数组键方法有7.5秒左右)。


对我来说最好的方法是

array_keys从初始数组中获取键数组,然后array_shift从它的第一个元素值中削减。您需要使用php 5.4+。


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

PHP73:

1
2
3
4
$array = ['a' => '..', 'b' => '..'];

array_key_first($array); // 'a'
array_key_last($array); // 'b';

http://php.net/manual/en/function.array-key-first.php


这是我发现的最简单的方法。快速,只有两行代码:-d

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


一个班轮:

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

# echos 'key1'

今天我必须搜索一个post请求返回的数组的第一个键。(并记下表格ID等的编号)

我发现了:返回PHP中关联数组的第一个键

http://php.net/key/键

我已经做到了,而且很有效。

1
2
3
4
5
6
7
    $data = $request->request->all();
    dump($data);
    while ($test = current($data)) {
        dump($test);
        echo key($data).'<br />';die();
        break;
    }

也许它会比其他人长15分钟。CYA。


你可以玩你的阵列

1
2
3
4
5
6
7
$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将密钥转换为值,并使用如上所示。