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

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

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

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


#1楼

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

#2楼

array_keys返回一个键数组。 以第一个条目。 另外,您可以在阵列上调用reset ,然后再调用key 。 后一种方法可能会稍快一些(我没有测试过),但是它具有重置内部指针的副作用。


#3楼

key($an_array)将给你第一个键

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


#4楼

2019更新

PHP 7.3开始,有一个名为array_key_first()的新内置函数,该函数将从给定数组中检索第一个键,而无需重置内部指针。 查看文档以获取更多信息。


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

#5楼

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

#6楼

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

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

我已经对其进行了测试,并且可以正常工作。

工作代码:


#7楼

如果效率对您而言并不那么重要,则可以在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) )。

高温超导


#8楼

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

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

我使用php 5.4进行了基准测试,并且reset / key指针方法(可接受的答案)似乎比foreach慢7倍。 操纵整个阵列的其他方法(array_keys,array_flip)明显更慢比并配有大型阵列工作时变得更糟

Foreach一点也不低效,请随时使用它!

编辑2015-03-03:

基准脚本已被要求,我没有原始脚本,但是做了一些新的测试。 这次,我发现foreach仅是reset / key的两倍。 我使用了100个键的数组,并且每种方法都运行了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


#9楼

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

#10楼

你可以试试

array_keys($data)[0]

#11楼

单线:

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

# echos 'key1'

#12楼

对我来说最好的方法是

array_shift(array_keys($array))

array_keys从初始数组中获取键数组,然后array_shift从它的第一个元素值array_shift剪切。 为此,您将需要PHP 5.4+。


#13楼

你可以玩你的数组

$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将键转换为值,并使用如上所示。


#14楼

这是我曾经发现的更简单的方法。 快速而只有两行代码:-D

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

#15楼

今天,我不得不搜索POST请求返回的数组的第一个键。 (并记下表格ID等的数字)

好吧,我发现了这一点: 在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。


#16楼

为了增强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秒)。


#17楼

对于2018年+

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

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

文档可在此处获得 。 😉


#18楼

php73:

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

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

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


#19楼

请找到以下内容:

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

工作示例:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值