【问题标题】:Return first key of associative array in PHP在 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() 无论如何都会在内存中创建数组键的副本,即使立即取消引用也是如此。单一表达式的简洁性很好,但内存消耗仍然存在。
  • 我刚刚意识到其他事情;这个问题已经自嘲了,好像你还在用

标签: php arrays key associative-array


【解决方案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】:

    您可以使用resetkey

    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 中抛出错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-09
    • 2013-04-23
    • 2015-07-23
    • 2011-05-06
    • 2012-10-26
    • 2021-11-09
    • 2020-09-04
    相关资源
    最近更新 更多