У меня есть массив:
array( 4 => 'apple', 7 => 'orange', 13 => 'plum' )
Я хочу получить первый элемент этого массива. Ожидаемый результат:
строка apple
Одно требование: это невозможно сделать с передачей по ссылке, поэтому array_shift — это не очень хорошее решение.
Как я могу это сделать по-другому?
Ответ 1
Лучший ответ, но дорогостоящий (O (n)):
array_shift(array_values($array));
Для O(1):
array_pop(array_reverse($array));
Другие варианты использования
Если изменение (в смысле сброса указателей массивов) $array не является проблемой, вы можете использовать:
reset($array);
Теоретически это должно быть более эффективным, если требуется «копия» массива:
array_shift(array_slice($array, 0, 1));
Начиная с PHP 5.4+ (но может вызвать ошибку индекса, если массив пуст):
array_values($array)[0];
Ответ 2
Самый простой способ:
$arr = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' )
echo reset($arr); // Echoes "apple"
Если вы хотите получить ключ: (выполните после сброса)
echo key($arr); // Echoes "4"
Из документации PHP:
reset() перематывает внутренний указатель массива на первый элемент и возвращает значение первого элемента массива или FALSE, если массив пуст.
Ответ 3
current($array)
возвращает первый элемент массива, согласно руководству PHP.
Каждый массив имеет внутренний указатель на его «текущий» элемент, который инициализируется на первый элемент, вставленный в массив.
Так что это работает до тех пор, пока вы не переместите указатель массива, а в противном случае вам придется использовать функцию reset(), которая перемотает массив и вернет первый элемент массива.
Согласно руководству PHP, reset.
reset() перематывает внутренний указатель массива на первый элемент и возвращает значение первого элемента массива.
Примеры функций current() и reset()
$array = array('step one', 'step two', 'step three', 'step four');
// по умолчанию указатель находится на первом элементе
echo current($array) . "<br />\n"; // "step one"
//передаем указатель массива и затем сбрасываем его
//пропустить два шага
next($array);
next($array);
echo current($array) . "<br />\n"; // "step three"
// сбросить указатель, начать заново с первого шага
echo reset($array) . "<br />\n"; // "step one"
Ответ 4
В PHP 7.3 были добавлены две функции для получения первого и последнего ключа массива напрямую без модификации исходного массива и без создания временных объектов:
array_key_first
array_key_last
Помимо семантического смысла, эти функции даже не перемещают указатель массива (как это сделал бы foreach). Имея ключи, можно получить значения непосредственно по ключам.
Примеры (все они требуют PHP 7.3+)
Получение первого/последнего ключа и значения:
$my_array = ['IT', 'rules', 'the', 'world'];
$first_key = array_key_first($my_array);
$first_value = $my_array[$first_key];
$last_key = array_key_last($my_array);
$last_value = $my_array[$last_key];
Получение первого/последнего значения в виде однострочных строк, предполагая, что массив не может быть пустым:
$first_value = $my_array[ array_key_first($my_array) ];
$last_value = $my_array[ array_key_last($my_array) ];
Получение первого/последнего значения в виде однострочных строк с настройками по умолчанию для пустых массивов:
$first_value = empty($my_array) ? 'default' : $my_array[ array_key_first($my_array) ];
$last_value = empty($my_array) ? 'default' : $my_array[ array_key_last($my_array) ];
Ответ 5
Некоторые массивы не работают с такими функциями, как list, reset или current. Возможно, это «ненастоящие» массивы — частично реализующие ArrayIterator, например.
Если вы хотите вытащить первое значение независимо от массива, вы можете сократить итератор:
foreach($array_with_unknown_keys as $value) break;
Ваше значение будет доступно в $value, а цикл прервется после первой итерации. Это более эффективно, чем копирование потенциально большого массива в функцию типа array_unshift(array_values($arr)). Таким же образом можно получить ключ:
foreach($array_with_unknown_keys as $key=>$value) break;
Если вы вызываете эту функцию из функции — просто вернитесь раньше:
function grab_first($arr) {
foreach($arr as $value) return $value;
}
Ответ 6
Из справочников Laravel:
function head($array) {
return reset($array);
}
Массив передается в функцию по значению, функция reset() воздействует на внутренний указатель копии массива и не затрагивает исходный массив (обратите внимание, что она возвращает false, если массив пуст). Пример использования:
$data = ['foo', 'bar', 'baz'];
current($data); // foo
next($data); // bar
head($data); // foo
next($data); // baz
Кроме того, вот альтернатива. Она совсем незначительно быстрее, но более интересна. Она позволяет легко изменить значение по умолчанию, если массив пуст:
function head($array, $default = null) {
foreach ($array as $item) {
return $item;
}
return $default;
}
Web