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

时间:2009-06-22 18:13:59

标签: php arrays

确定可能关联数组中第一个键的最佳方法是什么?我首先想到它只是预先排好阵列,然后立即打破它,就像这样:

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

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

23 个答案:

答案 0 :(得分:1256)

2019更新

PHP 7.3 开始,有一个名为array_key_first()的新内置函数,它将从给定数组中检索第一个键而不重置内部指针。查看documentation了解详情。


您可以使用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)

答案 1 :(得分:73)

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

答案 2 :(得分:51)

有趣的是,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

答案 3 :(得分:36)

key($an_array)将为您提供第一个密钥

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

答案 4 :(得分:22)

你可以尝试

array_keys($data)[0]

答案 5 :(得分:21)

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

答案 6 :(得分:20)

如果效率对您来说不重要,可以在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

答案 7 :(得分:16)

适用于2018年以上

从PHP 7.3开始,有一个array_key_first()函数可以实现以下目的:

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

文档可用here

答案 8 :(得分:12)

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

答案 9 :(得分:11)

请找到以下内容:

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

Working Example:

答案 10 :(得分:9)

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

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

我已经测试了它并且它有效。

Working Code:

答案 11 :(得分:4)

为了增强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 :(得分:3)

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

答案 13 :(得分:3)

对我有用的最佳方式是

System.Windows.Threading.DispatcherOperation op = App.RootFrame.Dispatcher.BeginInvoke(new Func<Uri>(() =>  
            {
                return RootFrame.CurrentSource;
            })
        );
        await op; //Not awaitable.

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

答案 14 :(得分:2)

php73:

$array = ['a' => '..', 'b' => '..'];

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

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

答案 15 :(得分:2)

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

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

答案 16 :(得分:1)

关于@Blixt 的回答,在 7.3.0 之前,可以使用这个 polyfill:

if (!function_exists('array_key_first')) {
  function array_key_first(array $array) {
    return key(array_slice($array, 0, 1, true));
  }
}

答案 17 :(得分:0)

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

好吧,我发现了这个: Return first key of associative array in PHP

http://php.net/key

我已经完成了这项工作,并且有效。

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

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

答案 18 :(得分:0)

使用:

$array = ['po','co','so'];

echo reset($array); 

结果:po

答案 19 :(得分:0)

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

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

答案 20 :(得分:0)

因为可以使用PHP 7.3.0函数array_key_first()

有几种方法可以为PHP 7.3.0之前的版本提供此功能。可以使用array_keys(),但效率可能很低。也可以使用reset()key(),但这可能会更改内部数组指针。一种有效的解决方案,它不更改内部数组指针,写为polyfill:

<?php
if (!function_exists('array_key_first')) {
    function array_key_first(array $arr) {
        foreach($arr as $key => $unused) {
            return $key;
        }
        return NULL;
    }
}
?>

答案 21 :(得分:0)

单行:

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

# echos 'key1'

答案 22 :(得分:-2)

您可以使用阵列

current

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

修改

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