Получение отдельных элементов
Этот урок показывает, как получить один элемент массива: по его позиции, по условию или случайным образом. Здесь же показано, как проверить, существует ли элемент вообще.
Когда поиск может завершиться неудачей, PHP отвечает значением null. Чтение несуществующего индекса, например $words[5] в массиве из 5 элементов, не прерывает программу: оно вызывает предупреждение (Undefined array key 5) и даёт null.
Оператор объединения с null ?? делает то же чтение безопасным и молчаливым: $words[5] ?? "missing" обращается к индексу без всяких предупреждений и подставляет "missing", когда элемента нет. Эта пара — null в значении «нет такого» и ?? для запасного значения — сквозная идиома всей страницы.
В PHP 8.4 также появились готовые функции поиска: array_find(), array_any() и array_all(). Ниже они используются рядом с классическими in_array() и count().
Получение по позиции
У каждого элемента обычного списка есть позиция, которая называется индексом. Первый индекс — 0, поэтому последний равен count($words) - 1.
Чтобы прочитать элемент по позиции, напишите индекс в квадратных скобках: $words[3]. PHP не считает с конца — $words[-1] искал бы ключ -1, которого не существует. Последний элемент читается с помощью array_key_last().
Для индекса, который может выйти за границы, ?? заменяет целое семейство вспомогательных функций: $words[$i] ?? null — это «элемент по индексу или null», а $words[$i] ?? fallback($i) — «элемент по индексу или иначе».
Элемент по позиции
$words[3] читает элемент с индексом 3. Так как отсчёт начинается с 0, это четвёртое слово.
Вывод: PHP-скрипт
<?php
$words = ["one", "two", "three", "four", "five"];
// Позиции начинаются с 0, поэтому индекс 3 — это четвёртый элемент.
echo $words[3], "\n";
Первый и последний элемент
Первый элемент — это $words[0]. Для последнего array_key_last($words) возвращает последний ключ — здесь 4, потому что в массиве 5 элементов, но первый индекс равен 0. $words[-1] не сработало бы: у массивов PHP нет отрицательных индексов.
Вывод: PHP-скрипт
<?php
$words = ["one", "two", "three", "four", "five"];
// Первый элемент находится по индексу 0.
echo $words[0], "\n";
// array_key_last() даёт последний ключ, здесь 4.
echo $words[array_key_last($words)], "\n";
Элемент по позиции или null
elementAt() отвечает элементом или значением null. Индекс 1 существует, поэтому первый вызов выводит two. Индекса 5 нет: вспомогательная функция даёт null, предупреждение не возникает, а ?? "missing" в месте вызова превращает null в текст missing.
Вывод: PHP-скрипт
<?php
// elementAt возвращает элемент с индексом $i или null, если такого нет.
function elementAt(array $items, int $i): mixed {
return $items[$i] ?? null;
}
$words = ["one", "two", "three", "four", "five"];
// Индекс 1 существует, поэтому запасное значение после ?? не используется.
echo elementAt($words, 1) ?? "missing", "\n";
// Индекса 5 не существует: без предупреждения, просто null -> "missing".
echo elementAt($words, 5) ?? "missing", "\n";
Элемент по позиции или запасное значение
Запасное значение после ?? может вычисляться. fallback(5) получает индекс и составляет сообщение «The value for index 5 is undefined». ?? ленив: функция выполняется только тогда, когда элемента действительно нет.
Вывод: PHP-скрипт
<?php
// Запасное значение составляет сообщение из полученного индекса.
function fallback(int $i): string {
return "The value for index $i is undefined";
}
$words = ["one", "two", "three", "four", "five"];
// ?? читает отсутствующий индекс без предупреждения и вызывает
// fallback() только тогда, когда элемента действительно нет.
echo $words[5] ?? fallback(5), "\n";
Получение по условию
Часто позиция неизвестна. Зато известно условие: первое слово длиннее 3 букв, последнее слово, начинающееся с «f». Условие — это функция, которая принимает один элемент и возвращает true или false.
Начиная с PHP 8.4 это одна строка: array_find() возвращает первый элемент, прошедший проверку, или null, когда её не проходит ни один. Поэтому для случая «ничего не совпало» не нужен особый признак: это просто null, и с ним справляется ?? или проверка !== null.
Функции для поиска последнего совпадения нет. Сначала переверните массив с помощью array_reverse(): первое совпадение в перевёрнутом массиве — это последнее совпадение в исходном.
Первое совпадение
array_find() даёт первое слово, для которого strlen($w) > 3. Это слово three.
Вывод: PHP-скрипт
<?php
$words = ["one", "two", "three", "four", "five"];
// array_find() возвращает первый элемент, прошедший проверку.
echo array_find($words, fn($w) => strlen($w) > 3), "\n";
Последнее совпадение
array_reverse($words) ставит five на первое место. Затем array_find() проходит перевёрнутый массив и останавливается на первом слове, начинающемся с f, — а это последнее такое слово исходного массива.
Вывод: PHP-скрипт
<?php
$words = ["one", "two", "three", "four", "five"];
// Сначала переворачиваем массив: первое совпадение в перевёрнутом
// массиве — это последнее совпадение в исходном.
$last = array_find(array_reverse($words), fn($w) => str_starts_with($w, "f"));
echo $last, "\n";
Первое совпадение или null
Ни одно слово не длиннее 6 букв, поэтому array_find() возвращает null, и ?? "not found" выводит запасное значение. В массиве чисел первое чётное число — 2, поэтому проверка !== null проходит и выводится 2.
Вывод: PHP-скрипт
<?php
$words = ["one", "two", "three", "four", "five"];
$numbers = [1, 2, 3, 4];
// Ни одно слово не длиннее 6 букв: array_find() возвращает null.
$w = array_find($words, fn($s) => strlen($s) > 6);
echo $w ?? "not found", "\n";
// Первое чётное число существует, поэтому проверка проходит.
$n = array_find($numbers, fn($n) => $n % 2 === 0);
if ($n !== null) {
echo $n, "\n";
}
Последнее совпадение или null
Перевёрнутые числа начинаются с 4, а 4 — чётное: поиск попадает в цель сразу же. Если бы чётного числа не было, array_find() вернул бы null и if ничего не вывел бы.
Вывод: PHP-скрипт
<?php
$numbers = [1, 2, 3, 4];
// Ищем в перевёрнутом массиве: первое попадание — это последнее совпадение.
$lastEven = array_find(array_reverse($numbers), fn($n) => $n % 2 === 0);
if ($lastEven !== null) {
echo $lastEven, "\n";
}
Получение имеющегося значения
Массив PHP может содержать null, чтобы отметить отсутствующее значение. Когда нужно только первое настоящее значение, условие сводится к $v !== null.
array_find() с такой проверкой возвращает первый элемент, в котором действительно есть значение, — или сам null, когда во всём массиве одни пропуски, что снова естественно читается с ??.
Первое значение, не равное null
Массив начинается с пропуска: null. Проверка $v !== null пропускает его, и array_find() возвращает two — первое значение, которое действительно есть.
Вывод: PHP-скрипт
<?php
$values = [null, "two", "three"];
// Первое значение, которое действительно есть.
echo array_find($values, fn($v) => $v !== null), "\n";
Случайный элемент
Чтобы выбрать случайный элемент, выберите случайный индекс. mt_rand($min, $max) возвращает целое число между двумя границами, включая обе, поэтому mt_rand(0, count($numbers) - 1) — это в точности допустимый индекс.
mt_srand(42) запускает генератор с фиксированного начального значения (seed). При одном и том же начальном значении программа каждый раз выбирает один и тот же элемент, из-за чего вывод становится предсказуемым — в этом примере начальное значение задано только для того, чтобы результат воспроизводился. Уберите mt_srand(), если хотите получать разный результат при каждом запуске.
Выбор случайного элемента
С начальным значением 42 генератор выбирает индекс 2, поэтому программа выводит 3. Измените начальное значение — и может получиться другое число.
Вывод: PHP-скрипт
<?php
$numbers = [1, 2, 3, 4];
// Фиксированное начальное значение делает «случайный» выбор одинаковым при каждом запуске.
mt_srand(42);
$i = mt_rand(0, count($numbers) - 1);
echo $numbers[$i], "\n";
Проверка наличия элемента
Чтобы проверить, есть ли значение в массиве, используйте in_array(). Всегда передавайте true третьим аргументом: он требует совпадения и типа, и значения, поэтому строка "1" не будет спутана с числом 1.
В PHP нет containsAll(). Небольшая вспомогательная функция с array_all() (новинка PHP 8.4) решает задачу: каждое искомое значение должно пройти свою проверку in_array().
Массив пуст, когда count($x) === 0, и не пуст, когда count($x) > 0. Существует и более короткое empty($x), но будьте осторожны: оно равно true для любого ложного значения — 0, "", null — а не только для пустых массивов, поэтому явное сравнение через count() выражает именно то, что вы имеете в виду.
Содержит одно значение
four есть в массиве, поэтому первая проверка выводит true. zero в нём нет, поэтому вторая выводит false. Третий аргумент true заставляет in_array() сравнивать через ===.
Вывод: PHP-скрипт
<?php
$words = ["one", "two", "three", "four", "five"];
// Третий аргумент true требует совпадения и типа, и значения.
echo json_encode(in_array("four", $words, true)), "\n";
echo json_encode(in_array("zero", $words, true)), "\n";
Содержит все значения
И four, и one есть в массиве, поэтому containsAll() возвращает true. zero отсутствует, поэтому второй вызов возвращает false — array_all() останавливается на первом искомом значении, которое не прошло проверку.
Вывод: PHP-скрипт
<?php
// containsAll возвращает true только тогда, когда каждое искомое значение есть в $items.
function containsAll(array $items, array $wanted): bool {
return array_all($wanted, fn($v) => in_array($v, $items, true));
}
$words = ["one", "two", "three", "four", "five"];
echo json_encode(containsAll($words, ["four", "one"])), "\n";
echo json_encode(containsAll($words, ["one", "zero"])), "\n";
Пустой или непустой
У $empty количество элементов равно 0, поэтому count($empty) === 0 — это true. В $words 5 элементов, поэтому count($words) > 0 тоже true. json_encode() превращает каждое логическое значение в текст true.
Вывод: PHP-скрипт
<?php
$words = ["one", "two", "three", "four", "five"];
$empty = [];
// Массив пуст, когда количество его элементов равно 0.
echo json_encode(count($empty) === 0), "\n";
echo json_encode(count($words) > 0), "\n";