У меня есть массив:
array( 4 => 'apple', 7 => 'orange', 13 => 'plum' )
Я хотел бы получить первый элемент этого массива. Ожидаемый результат: строка apple
Одно требование: это не может быть сделано с передачей по ссылке , поэтому array_shift
не является хорошим решением.
Как я могу это сделать?
&$array
качестве параметров.Ответы:
Оригинальный ответ, но дорогой (O (n)):
В O (1):
Другие варианты использования и т.д ...
Если изменение (в смысле сброса указателей массива)
$array
не является проблемой, вы можете использовать:Это должно быть теоретически более эффективно, если требуется массив «copy»:
В PHP 5.4+ (но может вызвать ошибку индекса, если пусто):
источник
list()
иreset()
гораздо более приятные решения на мой взгляд.Как указал Майк (самый простой способ):
Если вы хотите получить ключ: (выполните его после сброса)
Из документации PHP :
Описание:
источник
foreach
массиве объектов, вы облажаетесь.foreach
копируют массив, через который он проходит.key($arr)
и вы получите «4» (добавлен в ответ)reset()
. 2) Нет, foreach НЕ создает копию массива !!! Он только создает собственный указатель (даже не копию существующего - его также легко проверить, вызываяnext()
перед foreach).источник
Если вы не хотите терять текущую позицию указателя, просто создайте псевдоним для массива.
источник
reset()
уже возвращает первый элемент, поэтому использовать его не нужноcurrent()
-echo reset($arr)
должно хватитьcurrent
чтобыreset
избежать PHP уведомления / ошибку , полученную в справочных случаях, например ,current(array_filter(...));
в 3v4l .current($array)
может получить первый элемент массива, согласно руководству по PHP .Так что это работает до тех пор, пока вы не переместите указатель массива, иначе вам придется сбросить массив.
источник
current($array)
будет работать, только если указатель массива «в данный момент» указывает на первый элемент, в противном случаеreset($array)
потребуется.current()
больше не требуется ссылка, хотя документы PHP не отражают этого. Поэтому я думаю, что это стало лучшим решением.Вы можете получить N-й элемент с помощью языковой конструкции "список":
С помощью
array_keys
функции вы можете сделать то же самое для клавиш:источник
list($first_value) = $my_array;
мой взгляд, самый лучший вариант. У него нет проблем, связанных с другими ответами, представленными здесь: нет «перегиба», потому что он не копирует ни массив, ни создает новый. Нет «ссылок»: массив не изменен. Нет «сброса»: нет изменений во внутреннем указателе массива ...int
, попробуйте сделать,list($firstItem) = array('key1' => 'value1');
и вы получите ошибкуNotice: Undefined offset: 0
list($x) = foo();
эквивалентно$x = foo()[0];
. Обратите внимание, что это не обязательно то же самое, что «получить первый элемент», поскольку даже массив с целочисленным индексом может не иметь элемента с ключом 0. В моем случае я делал «list ($ order) = get_order ($ user) ;» но «get_order» возвращал заказы, основанные на их идентификаторе, который обычно не был 0. Как говорит @Sergiy, array_values () исправляет это, но снижает эффективность и (что более важно) удобочитаемость кода.PHP 5.4+:
источник
$array_values = array_values($array); $value = $array_values[0];
В PHP 7.3 добавлены две функции для непосредственного получения первого и последнего ключа массива без изменения исходного массива и без создания каких-либо временных объектов:
Помимо того, что они семантически значимы, эти функции даже не перемещают указатель массива (как
foreach
было бы).Имея ключи, можно получить значения по ключам напрямую.
Примеры (все они требуют PHP 7.3+)
Получение первого / последнего ключа и значения:
Получение первого / последнего значения в виде однострочников при условии, что массив не может быть пустым :
Получение первого / последнего значения в виде однострочников со значениями по умолчанию для пустых массивов:
источник
$first_value = $my_array[array_key_first($my_array)] ?? null;
Предположим, что:
Просто используйте:
чтобы получить первый элемент или
чтобы получить первый ключ.
Или вы можете отсоединить первый, если вы хотите удалить его.
источник
current
тогда?Некоторые массивы не работают с функциями , как
list
,reset
илиcurrent
. Может быть, это «ложные» массивы - например, частично реализующие ArrayIterator.Если вы хотите получить первое значение независимо от массива, вы можете замкнуть итератор:
Ваше значение будет доступно в
$value
и цикл будет прерван после первой итерации. Это более эффективно, чем копирование потенциально большого массива в функцию типа array_unshift (array_values ($ arr)).Вы также можете получить ключ таким образом:
Если вы вызываете это из функции, просто вернитесь рано:
источник
От помощников Ларавела :
Массив, передаваемый по значению функции, reset () влияет на внутренний указатель копии массива и не касается исходного массива (обратите внимание, что он возвращает
false
если массив пуст).Пример использования:
Также здесь есть альтернатива. Это немного быстрее, но интереснее. Это позволяет легко изменить значение по умолчанию, если массив пуст:
Для записи, вот еще один мой ответ , для последнего элемента массива.
источник
Держите это просто! Здесь есть много правильных ответов, но чтобы минимизировать путаницу, эти две работы работают и уменьшают много накладных расходов:
key($array)
получает первый ключ массиваcurrent($array)
получает первое значение массиваРЕДАКТИРОВАТЬ:
Относительно комментариев ниже. Следующий пример выведет:
string(13) "PHP code test"
источник
current
равно текущему элементу Вы должны сбросить указатель на начало массива, чтобы убедиться, что он действительно в начале.Просто сделайте:
источник
Я бы сделал
echo current($array)
.источник
current()
не выдает ошибку при передаче не ссылки. При условии, что указатель все еще находится в начале, это работает.reset
выдает уведомление «Только переменные должны передаваться по ссылке», в то время какcurrent
это не так: Пример онлайнового редактора PHPcurrent(array_filter(...));
.next()
,end()
или от любой другой функции, которая изменяет внутренний указатель массива. В моем примереcurrent()
возвращает ноль, потому что внутренний указатель находится вне диапазона массива. Но он также может «виртуально» указывать на любой / случайный элемент.Вывод:
источник
источник
Это гораздо эффективнее, чем
array_values()
потому, чтоeach()
функция не копирует весь массив.Для получения дополнительной информации см. Http://www.php.net/manual/en/function.each.php
источник
because the each() function does not copy the entire array.
+1Клудгый способ это:
источник
reset()
как указатель массива сбрасывается до того,foreach
как он все равно будет вызван.Получить первый элемент:
Получить последний элемент
источник
Большинство из них работают! НО для быстрого однострочного (низкого ресурса) вызова:
Хотя это работает, и прилично хорошо, пожалуйста, смотрите мой дополнительный ответ: https://stackoverflow.com/a/48410351/1804013
источник
current($array)
, которое требует, чтобы внутренний указатель массива был на первом элементе в любом случае, и в этом случаеecho reset($array)
наиболее подходящим.Я думаю, что использование array_values будет вашим лучшим выбором. Вы можете вернуть значение с нулевым индексом из результата этой функции, чтобы получить «яблоко».
источник
Это немного поздно для игры, но я столкнулся с проблемой, когда мой массив содержал элементы массива как дочерние элементы внутри него, и поэтому я не мог просто получить строковое представление первого элемента массива. При использовании РНР
current()
функции , мне удалось это:Благодаря всем текущим решениям мне удалось получить этот ответ, надеюсь, это поможет кому-нибудь когда-нибудь!
источник
Использование:
По умолчанию
array_slice
ключи не сохраняются, поэтому мы можем смело использовать ноль в качестве индекса.источник
Два решения для вас.
Решение 1 - Просто используйте ключ. Вы не сказали, что вы не можете его использовать. :)
Решение 2 - array_flip () + key ()
Решение 3 - array_keys ()
источник
Это не такой простой ответ в реальном мире. Предположим, у нас есть примеры возможных ответов, которые вы можете найти в некоторых библиотеках.
Как вы можете видеть, у нас есть несколько решений «одной линии», которые хорошо работают в некоторых случаях, но не во всех.
На мой взгляд, у вас должен быть этот обработчик только с массивами.
Теперь поговорим о производительности, предполагая, что у нас всегда есть массив, например:
array_shift
быстрееreset
, то есть быстрее, чем [count () - 1], и эти три быстрее, чемarray_values
иarray_slice
.источник
Я предполагаю, что автор просто искал способ получить первый элемент массива после получения его от какой-либо функции ( например , mysql_fetch_row ) без генерации STRICT «Только переменные должны передаваться по ссылке».
Если это так, то почти все способы, описанные здесь, получат это сообщение ... и некоторые из них используют много дополнительной памяти, дублирующей массив (или некоторую его часть). Простой способ избежать этого - просто присвоить значение inline перед вызовом любой из этих функций:
Таким образом, вы не получаете сообщение STRICT ни на экране, ни в журналах, ни создаваете дополнительные массивы. Он работает как с индексированными, так и с ассоциативными массивами.
источник
Мне нравится пример «списка», но «список» работает только в левой части задания. Если мы не хотим присваивать переменную, мы были бы вынуждены создать временное имя, которое в лучшем случае загрязняет нашу область видимости, а в худшем случае перезаписывает существующее значение:
Выше будет перезаписывать любое существующее значение $ x, а переменная $ x будет зависать, пока эта область активна (конец этой функции / метода или навсегда, если мы находимся на верхнем уровне). Это можно обойти, используя call_user_func и анонимную функцию, но это неуклюже:
Если мы будем использовать анонимные функции, подобные этой, мы сможем избежать перезагрузки и array_shift, даже если они используют передачу по ссылке. Это потому, что вызов функции будет связывать ее аргументы, и эти аргументы могут быть переданы по ссылке:
Однако это на самом деле излишне, так как call_user_func выполнит это временное назначение внутри. Это позволяет нам обрабатывать функции передачи по ссылке, как если бы они были передачей по значению, без каких-либо предупреждений или ошибок:
источник
Небольшое изменение в том, что написал Сарфраз:
источник
Мне не нравится возиться с внутренним указателем массива, но также неэффективно создавать второй массив с
array_keys()
илиarray_values()
, поэтому я обычно определяю это:источник
Попробуй это:
источник