Перейти к основному содержимому

Получение отдельных элементов

Этот урок показывает, как получить один элемент массива: по его позиции, по условию или случайным образом. Здесь же показано, как проверить, существует ли элемент вообще.

Когда поиск может завершиться неудачей, 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, это четвёртое слово.

Prompt
Создайте массив со словами one, two, three, four, five. Выведите элемент с индексом 3, используя квадратные скобки.
Вывод: PHP-скрипт
Element at a position

Первый и последний элемент

Первый элемент — это $words[0]. Для последнего array_key_last($words) возвращает последний ключ — здесь 4, потому что в массиве 5 элементов, но первый индекс равен 0. $words[-1] не сработало бы: у массивов PHP нет отрицательных индексов.

Prompt
Создайте массив со словами one, two, three, four, five. Выведите первый элемент по индексу 0, затем последний элемент с помощью array_key_last.
Вывод: PHP-скрипт
First and last element

Элемент по позиции или null

elementAt() отвечает элементом или значением null. Индекс 1 существует, поэтому первый вызов выводит two. Индекса 5 нет: вспомогательная функция даёт null, предупреждение не возникает, а ?? "missing" в месте вызова превращает null в текст missing.

Prompt
Напишите вспомогательную функцию elementAt, которая возвращает элемент по индексу или null, если такого индекса нет, используя оператор ??. Вызовите её на словах one, two, three, four, five с индексом 1 и с индексом 5 и выведите каждый результат, указав "missing" как резервное значение оператора ?? в месте вызова.
Вывод: PHP-скрипт
Element at a position, or null

Элемент по позиции или запасное значение

Запасное значение после ?? может вычисляться. fallback(5) получает индекс и составляет сообщение «The value for index 5 is undefined». ?? ленив: функция выполняется только тогда, когда элемента действительно нет.

Prompt
Создайте массив со словами one, two, three, four, five. Прочитайте индекс 5 с помощью оператора ?? и резервной функции, которая получает индекс и составляет текст "The value for index 5 is undefined". Выведите результат.
Вывод: PHP-скрипт
Element at a position, or a fallback

Получение по условию

Часто позиция неизвестна. Зато известно условие: первое слово длиннее 3 букв, последнее слово, начинающееся с «f». Условие — это функция, которая принимает один элемент и возвращает true или false.

Начиная с PHP 8.4 это одна строка: array_find() возвращает первый элемент, прошедший проверку, или null, когда её не проходит ни один. Поэтому для случая «ничего не совпало» не нужен особый признак: это просто null, и с ним справляется ?? или проверка !== null.

Функции для поиска последнего совпадения нет. Сначала переверните массив с помощью array_reverse(): первое совпадение в перевёрнутом массиве — это последнее совпадение в исходном.

Первое совпадение

array_find() даёт первое слово, для которого strlen($w) > 3. Это слово three.

Prompt
Создайте массив со словами one, two, three, four, five. С помощью array_find найдите первое слово длиннее 3 букв и выведите его.
Вывод: PHP-скрипт
First match

Последнее совпадение

array_reverse($words) ставит five на первое место. Затем array_find() проходит перевёрнутый массив и останавливается на первом слове, начинающемся с f, — а это последнее такое слово исходного массива.

Prompt
Создайте массив со словами one, two, three, four, five. Переверните массив с помощью array_reverse и с помощью array_find вместе с str_starts_with выведите последнее слово, начинающееся с "f".
Вывод: PHP-скрипт
Last match

Первое совпадение или null

Ни одно слово не длиннее 6 букв, поэтому array_find() возвращает null, и ?? "not found" выводит запасное значение. В массиве чисел первое чётное число — 2, поэтому проверка !== null проходит и выводится 2.

Prompt
Возьмите слова one, two, three, four, five и числа 1, 2, 3, 4. Найдите среди слов слово длиннее 6 букв с помощью array_find и выведите "not found" через оператор ??, когда результат равен null. Затем найдите первое чётное число и выведите его после проверки !== null.
Вывод: PHP-скрипт
First match, or null

Последнее совпадение или null

Перевёрнутые числа начинаются с 4, а 4 — чётное: поиск попадает в цель сразу же. Если бы чётного числа не было, array_find() вернул бы null и if ничего не вывел бы.

Prompt
Возьмите числа 1, 2, 3, 4. Найдите последнее чётное число, применив array_find к перевёрнутому массиву, и выведите его только тогда, когда результат не равен null.
Вывод: PHP-скрипт
Last match, or null

Получение имеющегося значения

Массив PHP может содержать null, чтобы отметить отсутствующее значение. Когда нужно только первое настоящее значение, условие сводится к $v !== null.

array_find() с такой проверкой возвращает первый элемент, в котором действительно есть значение, — или сам null, когда во всём массиве одни пропуски, что снова естественно читается с ??.

Первое значение, не равное null

Массив начинается с пропуска: null. Проверка $v !== null пропускает его, и array_find() возвращает two — первое значение, которое действительно есть.

Prompt
Создайте массив, содержащий null, "two" и "three". С помощью array_find с проверкой того, что значение не равно null, выведите первое значение, которое действительно есть.
Вывод: PHP-скрипт
First value that is not null

Случайный элемент

Чтобы выбрать случайный элемент, выберите случайный индекс. mt_rand($min, $max) возвращает целое число между двумя границами, включая обе, поэтому mt_rand(0, count($numbers) - 1) — это в точности допустимый индекс.

mt_srand(42) запускает генератор с фиксированного начального значения (seed). При одном и том же начальном значении программа каждый раз выбирает один и тот же элемент, из-за чего вывод становится предсказуемым — в этом примере начальное значение задано только для того, чтобы результат воспроизводился. Уберите mt_srand(), если хотите получать разный результат при каждом запуске.

Выбор случайного элемента

С начальным значением 42 генератор выбирает индекс 2, поэтому программа выводит 3. Измените начальное значение — и может получиться другое число.

Prompt
Создайте массив с числами 1, 2, 3, 4. Инициализируйте генератор случайных чисел вызовом mt_srand(42), выберите случайный индекс с помощью mt_rand от 0 до количества элементов минус 1 и выведите элемент с этим индексом.
Вывод: PHP-скрипт
Pick a random element

Проверка наличия элемента

Чтобы проверить, есть ли значение в массиве, используйте 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() сравнивать через ===.

Prompt
Создайте массив со словами one, two, three, four, five. С помощью in_array со строгим сравнением проверьте, есть ли в массиве "four" и есть ли в нём "zero". Выведите оба ответа с помощью json_encode.
Вывод: PHP-скрипт
Contains one value

Содержит все значения

И four, и one есть в массиве, поэтому containsAll() возвращает true. zero отсутствует, поэтому второй вызов возвращает false — array_all() останавливается на первом искомом значении, которое не прошло проверку.

Prompt
Напишите вспомогательную функцию containsAll, которая возвращает true только тогда, когда каждое значение второго массива найдено в первом, используя array_all и строгий in_array. Проверьте слова one, two, three, four, five на наличие four и one, затем на наличие one и zero. Выведите оба ответа с помощью json_encode.
Вывод: PHP-скрипт
Contains all values

Пустой или непустой

У $empty количество элементов равно 0, поэтому count($empty) === 0 — это true. В $words 5 элементов, поэтому count($words) > 0 тоже true. json_encode() превращает каждое логическое значение в текст true.

Prompt
Создайте массив со словами one, two, three, four, five и пустой массив. Выведите, равно ли количество элементов пустого массива 0, затем — больше ли нуля количество элементов массива слов, оба раза с помощью json_encode.
Вывод: PHP-скрипт
Empty or not empty