Вернуть первый ключ ассоциативного массива в PHP - PullRequest
36 голосов
/ 14 июля 2011

Я пытаюсь получить первый ключ ассоциативного массива, не создавая временную переменную через 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(), так как я не уверен, где будет указатель во время этой операции.


Добавление

Яследуя реализации, которую я недавно получил: как я уже упоминал в комментариях, она все равно будет использовать память, так что если это проблема, у этого вопроса нет решения.

$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)

I знал об этом, так как PHP не имеет таких возможностей оптимизации, но решил, что это войнапрямое упоминание.

Краткость принятого ответа хороша, и сработает, если вы работаете с массивами разумного размера.

Ответы [ 5 ]

63 голосов
/ 14 июля 2011

Хотя array_shift(array_keys($array)); будет работать, current(array_keys($array)); быстрее, поскольку не увеличивает внутренний указатель.

Любой из них будет работать, хотя.

Обновление

Как заметил @TomcatExodus, array_shift(); ожидает массив, переданный по ссылке, поэтому первый пример выдаст ошибку. Лучше всего придерживаться current();

18 голосов
/ 14 июля 2011

Вы можете использовать сброс и ключ :

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

или, вы можете использовать функцию:

function firstIndex($a) { foreach ($a as $k => $v) return $k; }
$key = firstIndex( $array );
1 голос
/ 14 июля 2011

each() все еще требуется временно, но потенциально намного меньше накладных расходов, чем использование array_keys().

1 голос
/ 14 июля 2011
array_shift(array_keys($array))
0 голосов
/ 13 сентября 2017

Как насчет использования 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)
...