在 PHP 中返回关联数组的第一个键
Posted
技术标签:
【中文标题】在 PHP 中返回关联数组的第一个键【英文标题】:Return first key of associative array in PHP 【发布时间】:2011-10-05 14:53:11 【问题描述】:我正在尝试获取关联数组的第一个键,而不是通过array_keys()
等创建临时变量以通过引用传递。不幸的是,reset()
和 array_shift()
都通过引用来获取数组参数,因此似乎都不是可行的结果。
使用 php 5.4,我会在天堂; array_keys($array)[0];
,但不幸的是,这当然也不是一个选项。
我可以创建一个函数来达到这个目的,但我只能想象 PHP 的 array_*
函数会在单个语句中产生所需的结果,我无法想象的或想出的。
所以:
$array = array('foo' => 'bar', 'hello' => 'world');
$firstKey = assorted_functions($array); // $firstKey = 'foo'
我的问题中使用“无参考”条款的原因只是因为我认为array_keys()
是必需的(如果有办法通过参考传递,请开除)
我会使用key()
,但这需要reset()
,因为我不确定执行此操作时指针的位置。
附录
我正在跟进我最近的一个认识:正如我在 cmets 中提到的,它会使用相同的内存,所以如果这是一个问题,这个问题没有解决方案。
$a = range(0,99999);
var_dump(memory_get_peak_usage()); // int(8644416)
$k = array_keys($a)[0];
var_dump(memory_get_peak_usage()); // int(17168824)
我知道这一点,因为 PHP 没有这样的优化功能,但认为它值得明确提及。
虽然接受的答案很简洁,但如果您使用的是合理大小的数组,那么它会起作用。
【问题讨论】:
我对foreach($array as &$key) return $key;
有一个模糊的 hackish 想法,可能会完成你想要的,但我懒得测试它,也不太确定你想要什么。
@Marc B foreach($array as $key=>$value) return $key; 应该可以工作
@Marc B - 尝试使用单个语句返回值。我可以将foreach
包裹在call_user_func(function())
中,但这有点疯狂。
我刚刚意识到:我认为如何切片并不重要,因为现在 IIRC,array_keys()
无论如何都会在内存中创建数组键的副本,即使立即取消引用也是如此。单一表达式的简洁性很好,但内存消耗仍然存在。
我刚刚意识到其他事情;这个问题已经自嘲了,好像你还在用
【参考方案1】:
如何使用 array_slice(结合 array_keys 用于关联数组)?
$a = range(0,999999);
var_dump(memory_get_peak_usage());
$k = array_keys(array_slice($a, 0, 1, TRUE))[0];
var_dump(memory_get_peak_usage());
var_dump($k);
$k = array_keys($a)[0];
var_dump(memory_get_peak_usage());
作为输出(至少对我来说):
int(36354360)
int(36355112)
int(0)
int(72006024)
int(0)
【讨论】:
【参考方案2】:虽然array_shift(array_keys($array));
可以工作,但current(array_keys($array));
更快,因为它不推进内部指针。
任何一个都可以。
更新
正如@TomcatExodus 所指出的,array_shift();
需要一个通过引用传递的数组,因此第一个示例将发出错误。最好坚持current();
【讨论】:
宾果游戏。非常感谢current(array_keys())
。仅供参考,array_keys()
或array_values()
生成的数组当然是新的,因此它的指针始终位于第一个元素,对吗?
优秀;再次感谢。我一定需要更多的咖啡,因为我越看答案,它似乎就越明显:) 哦,还有array_shift()
上的注释;它没有。带有error_reporting(-1)
的 PHP 5.3.6 发出错误。
key($array)
不是更快吗?
也许吧。它会完成这项工作。使用任何你想要的。 OP 想要 key()
以外的东西,所以就是这样。
当前(array_keys($array));是比较快的?或以下更快 foreach($array as $key => $val) echo $key;break;【参考方案3】:
您可以使用reset 和key:
reset( $array );
$first_key = key( $array );
或者,你可以使用一个函数:
function firstIndex($a) foreach ($a as $k => $v) return $k;
$key = firstIndex( $array );
【讨论】:
感谢@Dark Slipstream - 试图在一个语句中完成,没有reset()
。
你说你可以使用一个函数,使用那个。
"可以",但不想这样做,尤其是考虑到优雅的解决方案。不过谢谢:)【参考方案4】:
each()
仍然是临时需要的,但可能比使用 array_keys()
的开销要小得多。
【讨论】:
谢谢@Orbling - 确实,有很多使用临时的方法,但这就是我试图避免的。我的奋斗已经从实践变成了学术:P 另外,也许应该提到;阵列不是很长,只是很深。第一个维度可能有 3 - 5 个元素,因此虽然array_keys()
开销更大,但它不会产生巨大的数组。【参考方案5】:
array_shift(array_keys($array))
【讨论】:
感谢@RiaD - 严格的标准,array_shift()
需要一个引用数组,这是不行的。
@Tomcat。它得到了新的数组。所以你的阵列会好的。还是触发一些错误/通知?
抱歉含糊不清;是的,它发出通知Strict Standards
好的,谢谢,下次就知道了:)【还没PHP测试】
array_shift 通过引用获取数组,因此它会在 php 5.4 中抛出错误以上是关于在 PHP 中返回关联数组的第一个键的主要内容,如果未能解决你的问题,请参考以下文章