Если бы у меня был массив, как:
$array['foo'] = 400;
$array['bar'] = 'xyz';
И я хотел получить первый элемент из этого массива, не зная ключа для него, как бы я это сделал? Есть ли функция для этого?
Если бы у меня был массив, как:
$array['foo'] = 400;
$array['bar'] = 'xyz';
И я хотел получить первый элемент из этого массива, не зная ключа для него, как бы я это сделал? Есть ли функция для этого?
Ответы:
reset()
дает вам первое значение массива, если у вас есть элемент внутри массива:
$value = reset($array);
Это также дает вам, FALSE
если массив пуст.
$arr = array(/* stuff */); $val = $arr? reset($arr): /* value to indicate array is empty */;
Если вы недостаточно знаете о массиве (вы не уверены, является ли первый ключ foo или bar ), тогда массив также может быть, может быть, пустым .
Поэтому было бы лучше проверить, особенно если есть вероятность, что возвращаемое значение может быть логическим FALSE:
$value = empty($arr) ? $default : reset($arr);
Приведенный выше код использует reset
и поэтому имеют побочные эффекты (она сбрасывает внутренний указатель массива), так что вы можете предпочитаете использовать array_slice
для быстрого доступа к копии первого элемента массива:
$value = $default;
foreach(array_slice($arr, 0, 1) as $value);
Предполагая, что вы хотите получить ключ и значение отдельно , вам нужно добавить четвертый параметр в array_slice
:
foreach(array_slice($arr, 0, 1, true) as $key => $value);
Чтобы получить первый элемент в виде пары ( key => value
):
$item = array_slice($arr, 0, 1, true);
Простая модификация для получения последнего элемента, ключа и значения отдельно:
foreach(array_slice($arr, -1, 1, true) as $key => $value);
Если массив не очень большой, вам на самом деле не нужно, array_slice
и вы можете получить копию всего массива ключей, а затем получить первый элемент:
$key = count($arr) ? array_keys($arr)[0] : null;
Однако, если у вас очень большой массив, для вызова array_keys
потребуется больше времени и памяти больше, чем array_slice
(обе функции обходят массив, но последняя завершает работу, как только набирает требуемое количество элементов - то есть один).
Заметное исключение - когда у вас есть первый ключ, который указывает на очень большой и извилистый объект. В этом случае array_slice
будет дублировать этот первый большой объект, а array_keys
захватывать будут только ключи.
PHP 7.3 реализует array_key_first()
так же, как и array_key_last()
. Они явно предоставлены для эффективного доступа к первому и последнему ключам без сброса внутреннего состояния массива в качестве побочного эффекта.
Таким образом , в PHP 7.3 первое значение из $array
могут быть доступны с
$array[array_key_first($array)];
Вам все равно лучше проверить, что массив не пустой, иначе вы получите ошибку:
$firstKey = array_key_first($array);
if (null === $firstKey) {
$value = "Array is empty"; // An error should be handled here
} else {
$value = $array[$firstKey];
}
Поддельный цикл, который прерывается на первой итерации:
$key = $value = NULL;
foreach ($array as $key => $value) {
break;
}
echo "$key = $value\n";
Или используйте each()
( предупреждение: устарело с PHP 7.2.0 ):
reset($array);
list($key, $value) = each($array);
echo "$key = $value\n";
reset()
Функция будет извлекать только первое значение.
Там есть несколько вариантов. array_shift()
вернет первый элемент, но он также удалит первый элемент из массива.
$first = array_shift($array);
current()
вернет значение массива, на который указывает указатель его внутренней памяти, который является первым элементом по умолчанию.
$first = current($array);
Если вы хотите убедиться, что он указывает на первый элемент, вы всегда можете использовать reset()
.
reset($array);
$first = current($array);
reset()
самом деле note возвращает элемент, поэтому после него с $first = current($array)
избыточностью.
Просто для того, чтобы у нас были некоторые другие варианты: reset($arr);
достаточно, если вы не пытаетесь удерживать указатель массива на месте, а с очень большими массивами это требует минимальных затрат. Тем не менее, есть некоторые проблемы с этим:
$arr = array(1,2);
current($arr); // 1
next($arr); // 2
current($arr); // 2
reset($arr); // 1
current($arr); // 1 !This was 2 before! We've changed the array's pointer.
Способ сделать это без изменения указателя:
$arr[reset(array_keys($arr))]; // OR
reset(array_values($arr));
Преимущество $arr[reset(array_keys($arr))];
заключается в том, что он выдает предупреждение, если массив фактически пуст.
другой простой и легкий способ сделать это, используя array_values
array_values($array)[0]
reset()
это гораздо лучший вариант, так как он возвращает false, если массив пуст. ваше решение не сработает, например, в вопросе
array_values($array)[0] ?? FALSE
Мы можем сделать
$first = reset($array);
Вместо того
reset($array);
$first = current($array);
Так как reset()
возвращает первый элемент массива после сброса;
Используйте функцию reset (), чтобы получить первый элемент из этого массива, не зная ключа для него, как это.
$value = array('foo' => 400, 'bar' => 'xyz');
echo reset($value);
выход // 400
Вы можете попробовать это.
Чтобы получить первое значение массива: -
<?php
$large_array = array('foo' => 'bar', 'hello' => 'world');
var_dump(current($large_array));
?>
Чтобы получить первый ключ массива
<?php
$large_array = array('foo' => 'bar', 'hello' => 'world');
$large_array_keys = array_keys($large_array);
var_dump(array_shift($large_array_keys));
?>
Я делаю это, чтобы получить первое и последнее значение. Это работает с большим количеством значений тоже.
$a = array(
'foo' => 400,
'bar' => 'xyz',
);
$first = current($a); //400
$last = end($a); //xyz
Начиная с PHP 7.3.0 можно обойтись без сброса внутреннего указателя. Вы бы использовали array_key_first
. Если вы уверены, что ваш массив имеет значения, то вы можете просто сделать:
$first = $array[array_key_first($array)];
Скорее всего, вы захотите обработать случай, когда массив пуст:
$first = (empty($array)) ? $default : $array[array_key_first($array)];
Вы можете просто использовать $array[0]
. это даст вам первый товар всегда