Работа с последовательностями целых чисел
В этой заметке разберемся с тем, как управляться с последовательностями целых чисел в PHP-скриптах.
Первичная задача состоит в следующем: нам нужно выполнить некий фрагмент кода для каждого целого числа из некоего диапазона.
Начнем мы с простейшего цикла for и завершим чем-то гораздо более интересным и функциональным.
Итак, как наша задача решается с помощью цикла for?
$start = 3; $end = 7; for ($i = $start; $i <= $end; $i++) { printf("%d в квадрате равно %d<br>", $i, $i * $i); }
Понятно, что в качестве приращения можно использовать не только 1, например:
$start = 3; $end = 7; for ($i = $start; $i <= $end; $i += 2) { printf("%d в квадрате равно %d<br>", $i, $i * $i); }
Используя конструкцию "+= 2" мы говорим интерпретатору о том, что к текущему числу нужно прибавить значение 2.
В случае, если нам нужно сохранить числа для использования, помимо перебора нужно использовать метод range():
$numbers = range(3, 7); foreach ($numbers as $n) { printf("%d в квадрате равно %d<br>", $n, $n * $n); } foreach ($numbers as $n) { printf("%d в кубе равно %d<br>", $n, $n * $n * $n); }
Подобного плана циклы очень часто используются при создании программ и веб-приложений.
Практически в любых ситуациях, где мы имеем дело с массивами данных или некими последовательностями, мы столкнемся и с разного рода циклами.
В частности, цикл for использует один целочисленный счетчик, а произвольный выбор приращения (как в сторону увеличения, так и в сторону уменьшения), позволяет лучше контролировать ход выполнения цикла. Более того, значение счетчика можно изменять и внутри цикла.
В последнем примере функция range() возвращает массив значений от $start до $end. Преимуществом range() является лаконичность, однако не обошлось и без недостатков - большой массив может занимать много лишней памяти (а ведь память, как мы знаем, лишней не бывает:)).
Если вам нужно, чтобы range() использовала нестандартные приращения, нужно передать ей третий аргумент, которой и определит величину шага.
— Регулярная проверка качества ссылок по более чем 100 показателям и ежедневный пересчет показателей качества проекта.
— Все известные форматы ссылок: арендные ссылки, вечные ссылки, публикации (упоминания, мнения, отзывы, статьи, пресс-релизы).
— SeoHammer покажет, где рост или падение, а также запросы, на которые нужно обратить внимание.
SeoHammer еще предоставляет технологию Буст, она ускоряет продвижение в десятки раз, а первые результаты появляются уже в течение первых 7 дней. Зарегистрироваться и Начать продвижение
Например, вызов range(1,10,2) возвратит массив с элементами 1, 3, 5, 7, 9.
Обратите внимание, что значение $start, т.е. первый аргумент может быть больше значения $end (второго аргумента). В этом случае происходит вполне логичная вещь: числа, возвращаемые функцией range(), упорядочиваются по убыванию.
Еще одно из применений функции range - генерация символьных последовательностей.
Если мы пропишем такой код:
print_r(range('l', 'p'));
то на выходе получим массив:
Array ( [0] => l [1] => m [2] => n [3] => o [4] => p )
При этом нужно учесть, что символьные последовательности, сгенерированные функцией range(),состоят из байтов ASCII, поэтому с многобайтовыми символами Юникода функция работать не будет.
Следующим момент. Начиная с PHP 5.5 для работы с сериями можно использовать так называемые генераторы. Это функции, которые вместо вызова return для возвращения значения вызывают yield (возможно, в цикле).
Вызов такой функции-генератора может быть применен всюду, где может использоваться массив, и вы работаете с сериями значений, передаваемых ключевому слову yield. В примере ниже мы используем генератор для построения списка квадратов:
function squares($start, $stop) { if ($start < $stop) { for ($i = $start; $i <= $stop; $i++) { yield $i => $i * $i; } } else { for ($i = $stop; $i >= $start; $i--) { yield $i => $i * $i; } } } foreach (squares(3, 15) as $n => $square) { printf("%d в квадрате равно %d<br>", $n, $square); }
Смысл в том, что PHP продолжает вызывать функцию squares() до тех пор, пока та вызывает yield. Ключ и значение, передаваемое yield, могут использоваться в цикле foreach, как обычный элемент массива.
Генераторы удобны прежде всего тем, что в них можно реализовать произвольное поведение для создания каждого значения (то, что запрограммировано в вашей функции), но значения генерируются по требованию.
Кроме того, нам не нужно резервировать память для предварительного создания всего массива, как в случае с range(), прежде чем начать работать с ним.
Понравился материал и хотите отблагодарить?
Просто поделитесь с друзьями и коллегами!
Смотрите также:
PHP: Получение информации об объекте или классе, методах, свойствах и наследовании |
|
Функции обратного вызова, анонимные функции и механизм замыканий |
|
Деструктор и копирование объектов с помощью метода __clone() |
|
Эволюция веб-разработчика или Почему фреймворк - это хорошо? |
|
Магические методы в PHP или методы-перехватчики (сеттеры, геттеры и др.) |
|
50 классных сервисов, программ и сайтов для веб-разработчиков Сервис онлайн-записи на собственном Telegram-боте
Попробуйте сервис онлайн-записи VisitTime на основе вашего собственного Telegram-бота:— Разгрузит мастера, специалиста или компанию; — Позволит гибко управлять расписанием и загрузкой; — Разошлет оповещения о новых услугах или акциях; — Позволит принять оплату на карту/кошелек/счет; — Позволит записываться на групповые и персональные посещения; — Поможет получить от клиента отзывы о визите к вам; — Включает в себя сервис чаевых. Для новых пользователей первый месяц бесплатно. Зарегистрироваться в сервисе |