Вернуть первый ключ ассоциативного массива в PHP
Я пытаюсь получить первый ключ ассоциативного массива, не создавая временную переменную через 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)
Я знал это, так как PHP не имеет таких возможностей оптимизации, но решил, что это заслуживает явного упоминания.
Краткость принятого ответа хороша, и будет работать, если вы работаете с массивами разумного размера.
5 ответов
Хотя array_shift(array_keys($array));
буду работать, current(array_keys($array));
быстрее, поскольку он не продвигает внутренний указатель.
Либо один будет работать, хотя.
Обновить
Как заметил @TomcatExodus, array_shift();
ожидает массив, переданный по ссылке, поэтому первый пример выдаст ошибку. Лучше придерживаться current();
each()
все еще временно требуется, но потенциально намного меньше накладных расходов, чем использование array_keys()
,
Как насчет использования 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)