Новшества версии 7.3: практические примеры и советы по обновлению
Новые функции для работы с массивами в PHP 7.3
Основное эффективное решение для получения первого и последнего ключа ассоциативного массива в PHP 7.3 - использование встроенных функций array_key_first() и array_key_last(). Эти функции работают без изменения внутреннего указателя массива и без копирования всех ключей, что делает их быстрыми и безопасными.
$array = ['a' => 1, 'b' => 2, 'c' => 3];
$firstKey = array_key_first($array); // 'a'
$lastKey = array_key_last($array); // 'c'
Функции возвращают null, если массив пуст. Примечание: доступны только с PHP 7.3. Для более старых версий потребуются альтернативные подходы.
Как получить первый ключ массива с помощью сброса указателя?
До PHP 7.3 часто использовали пару reset() и key(). reset() перемещает внутренний указатель массива на первый элемент, а key() возвращает его ключ.
$array = ['apple' => 1, 'banana' => 2];
reset($array);
$firstKey = key($array); // 'apple'
Проблема: reset() изменяет внутренний указатель массива. Если после этого нельзя продолжить итерацию с текущей позиции, это может нарушить логику программы. Кроме того, reset() возвращает значение первого элемента, а не ключ, что может ввести в заблуждение.
Типичная ошибка: забыть вызвать reset() перед key() - в этом случае key() вернёт ключ текущей позиции, которая может быть не первым элементом.
Как получить первый ключ через функцию array_keys?
Можно извлечь все ключи массива с помощью array_keys() и взять первый элемент полученного массива.
$array = ['x' => 10, 'y' => 20];
$keys = array_keys($array);
$firstKey = $keys[0] ?? null; // 'x'
Проблема: array_keys() создаёт новый массив, содержащий все ключи. Для больших массивов это приводит к значительному расходу памяти и времени. Также неэффективно, если нужен только один ключ.
Ошибка: не проверять существование индекса 0 для пустого массива - приведёт к ошибке Undefined array key 0. В примере выше используется оператор ?? для защиты.
Как получить последний ключ используя end() и key()?
Аналог для последнего ключа: end() перемещает указатель на конец массива, key() возвращает его ключ.
$array = ['a' => 100, 'b' => 200, 'c' => 300];
end($array);
$lastKey = key($array); // 'c'
Проблема: те же, что и с reset() - изменение внутреннего указателя. После end() указатель смещается, и дальнейшая итерация с foreach или другими функциями может дать неожиданные результаты.
Совет: если нужно сохранить исходное состояние указателя, можно запомнить текущее значение с помощью current() и потом восстановить его, но это усложняет код.
Как получить первый ключ без изменения указателя?
Можно воспользоваться циклом foreach с немедленным прерыванием. Это не изменяет внутренний указатель, но требует прохода по массиву.
$array = ['one' => 1, 'two' => 2];
foreach ($array as $key => $value) {
$firstKey = $key;
break;
}
// $firstKey = 'one'
Проблема: для получения только первого ключа всё равно происходит полный обход до первого элемента, но в больших массивах это неэффективно, так как цикл всё равно инициализируется. Однако это безопасно с точки зрения указателя.
Примечание: foreach работает с копией массива, если массив не является ссылкой, но это не влияет на память напрямую.
Расширенные примеры использования новых возможностей PHP 7.3
Пример 1: array_key_first и array_key_last с пустым массивом
$emptyArray = [];
$first = array_key_first($emptyArray);
$last = array_key_last($emptyArray);
var_dump($first, $last);
NULL NULL
Обе функции возвращают null для пустого массива. Это позволяет безопасно использовать их в условных конструкциях без дополнительных проверок.
Пример 2: Получение первого и последнего элемента массива с помощью array_key_first/last и array_slice
$array = ['apple' => 'red', 'banana' => 'yellow', 'grape' => 'purple'];
$firstKey = array_key_first($array);
$lastKey = array_key_last($array);
$firstElement = [$firstKey => $array[$firstKey]];
$lastElement = [$lastKey => $array[$lastKey]];
var_dump($firstElement, $lastElement);
array(1) {
["apple"] =>
string(3) "red"
}
array(1) {
["grape"] =>
string(6) "purple"
}
Этот подход удобен, когда нужно извлечь только первый или последний элемент, не затрагивая остальную часть массива.
Пример 3: Завершающие запятые в вызовах функций (trailing commas)
function greet($name, $greeting) {
return "$greeting, $name!";
}
// До PHP 7.3 такая запись вызывала синтаксическую ошибку
echo greet(
'Alice',
'Hello',
); // PHP 7.3+ допускает запятую после последнего аргумента
Hello, Alice!
Трейлинг-запятые разрешены также в объявлениях функций и методах, что упрощает добавление новых аргументов при редактировании.
Пример 4: Обработка ошибок JSON с JSON_THROW_ON_ERROR
try {
$data = json_decode('{ invalid json', true, 512, JSON_THROW_ON_ERROR);
} catch (JsonException $e) {
echo 'Ошибка JSON: ' . $e->getMessage();
}
Ошибка JSON: Syntax error
Раньше приходилось проверять json_last_error(). Теперь исключение выбрасывается автоматически, что делает код чище и безопаснее.
Пример 5: Присвоение по ссылке в list()
$array = [1, 2, 3];
list(&$a, &$b, &$c) = $array;
$b = 100;
var_dump($array);
array(3) {
[0]=>
int(1)
[1]=>
&int(100)
[2]=>
int(3)
}
В PHP 7.3 появилась возможность использовать ссылки в синтаксисе list(). Это позволяет изменять элементы исходного массива через присвоение переменным.
Пример 6: Измерение времени с hrtime()
$start = hrtime(true);
// выполнение какого-либо кода
usleep(1000);
$end = hrtime(true);
$duration = ($end - $start) / 1e6; // в миллисекундах
echo "Время выполнения: $duration мс";
Время выполнения: 1.002 мс
Функция hrtime() возвращает высокоточное время (наносекунды). Аргумент true даёт количество наносекунд с произвольной эпохи.