Php yield чтение файла

PHP
Генераторы

Генераторы полезны, когда вам нужно создать большую коллекцию для последующего перебора. Они являются более простой альтернативой созданию класса, который реализует Iterator , который часто бывает излишним.

Например, рассмотрим функцию ниже.

function randomNumbers(int $length) < $array = []; for ($i = 0; $i < $length; $i++) < $array[] = mt_rand(1, 10); >return $array; > 

Вся эта функция создает массив, заполненный случайными числами. Чтобы использовать его, мы можем сделать randomNumbers(10) , что даст нам массив из 10 случайных чисел. Что делать, если мы хотим генерировать миллион случайных чисел? randomNumbers(1000000) сделают это для нас, но при стоимости памяти. Один миллион целых чисел, хранящихся в массиве, использует приблизительно 33 мегабайта памяти.

$startMemory = memory_get_usage(); $randomNumbers = randomNumbers(1000000); echo memory_get_usage() - $startMemory, ' bytes'; 

Это связано с тем, что генерируется и возвращается всего миллион случайных чисел, а не один за раз. Генераторы — это простой способ решить эту проблему.

Повторная запись randomNumbers () с использованием генератора

randomNumbers() может быть переписана для использования генератора.

 > foreach (randomNumbers(10) as $number)

Используя генератор, нам не нужно создавать полный список случайных чисел для возврата из функции, что приводит к значительно меньшему использованию памяти.

Чтение большого файла с генератором

Одним из распространенных вариантов использования генераторов является чтение файла с диска и повторение его содержимого. Ниже приведен класс, который позволяет вам перебирать CSV-файл. Использование памяти для этого скрипта очень предсказуемо и не будет колебаться в зависимости от размера файла CSV.

file = fopen($filePath, 'r'); > public function rows() < while (!feof($this->file)) < $row = fgetcsv($this->file, 4096); yield $row; > return; > > $csv = new CsvReader('/path/to/huge/csv/file.csv'); foreach ($csv->rows() as $row) < // Do something with the CSV row. >

Ключевое слово доходности

Оператор yield похож на оператор return, за исключением того, что вместо прекращения выполнения функции и возврата, yield вместо этого возвращает объект Generator и приостанавливает выполнение функции генератора.

Читайте также:  Python оператор if логические операторы

Вот пример функции диапазона, написанной как генератор:

function gen_one_to_three() < for ($i = 1; $i > 

Вы можете видеть, что эта функция возвращает объект Generator, var_dump вывод var_dump :

var_dump(gen_one_to_three()) # Outputs: class Generator (0)

Условные значения

Затем объект Generator можно повторить как массив.

foreach (gen_one_to_three() as $value)

Вышеприведенный пример выводит:

Учет значений с помощью клавиш

В дополнение к уступающим значениям вы также можете получить пары ключ / значение.

function gen_one_to_three() < $keys = ["first", "second", "third"]; for ($i = 1; $i $i; > > foreach (gen_one_to_three() as $key => $value)

Вышеприведенный пример выводит:

Использование функции send () для передачи значений генератору

Генераторы быстро кодируются и во многих случаях являются тонкой альтернативой сильным итераторам. При быстрой реализации возникает небольшая нехватка контроля, когда генератор должен прекратить генерировать или если он должен генерировать что-то еще. Однако это может быть достигнуто с помощью функции send() , позволяющей запрашивающей функции отправлять параметры генератору после каждого цикла.

//Imagining accessing a large amount of data from a server, here is the generator for this: function generateDataFromServerDemo() < $indexCurrentRun = 0; //In this example in place of data from the server, I just send feedback everytime a loop ran through. $timeout = false; while (!$timeout) < $timeout = yield $indexCurrentRun; // Values are passed to caller. The next time the generator is called, it will start at this statement. If send() is used, $timeout will take this value. $indexCurrentRun++; >yield 'X of bytes are missing.
'; > // Start using the generator $generatorDataFromServer = generateDataFromServerDemo (); foreach($generatorDataFromServer as $numberOfRuns) < if ($numberOfRuns < 10) < echo $numberOfRuns . "
"; > else < $generatorDataFromServer->send(true); //sending data to the generator echo $generatorDataFromServer->current(); //accessing the latest element (hinting how many bytes are still missing. > >

введите описание изображения здесь

  • Начало работы с PHP
  • APCu
  • BC Math (бинарный калькулятор)
  • Imagick
  • IMAP
  • JSON
  • Loops
  • PDO
  • PHP MySQLi
  • php mysqli affected rows возвращает 0, когда он должен возвращать положительное целое число
  • PHP Встроенный сервер
  • PHPDoc
  • PSR
  • SimpleXML
  • SQLite3
  • Streams
  • URL-адрес
  • UTF-8,
  • WebSockets
  • XML
  • YAML в PHP
  • Автозагрузка грунтовки
  • Альтернативный синтаксис для структур управления
  • Анализ HTML
  • Асинхронное программирование
  • Аутентификация HTTP
  • Безопасность
  • Буферизация вывода
  • Вклад в PHP Core
  • Внедрение зависимости
  • Внесение изменений в Руководство по PHP
  • Волшебные константы
  • Волшебные методы
  • Вывод значения переменной
  • Выполнение по массиву
  • Генераторы
  • закрытие
  • Защитите Remeber Me
  • Интерфейс командной строки (CLI)
  • Использование cURL в PHP
  • Использование MongoDB
  • Использование Redis с PHP
  • Использование SQLSRV
  • Итерация массива
  • Как определить IP-адрес клиента
  • Как разбить URL-адрес
  • Класс Datetime
  • Классы и объекты
  • Клиент SOAP
  • Комментарии
  • Компилировать расширения PHP
  • Компиляция ошибок и предупреждений
  • Константы
  • Контрольные структуры
  • криптография
  • кэш
  • локализация
  • Манипулирование массивом
  • Манипуляции заголовков
  • Массивы
  • Машинное обучение
  • Менеджер зависимостей композитора
  • Многопоточное расширение
  • многопроцессорная обработка
  • Монго-PHP
  • Область переменных
  • Обработка изображений с помощью GD
  • Обработка исключений и отчетов об ошибках
  • Обработка нескольких массивов вместе
  • Обработка файлов
  • Общие ошибки
  • операторы
  • отладка
  • Отправка электронной почты
  • отражение
  • переменные
  • Переменные Superglobal PHP
  • Печенье
  • Поддержка Unicode в PHP
  • Пространства имен
  • Работа с датами и временем
  • Развертывание докеров
  • Регулярные выражения (regexp / PCRE)
  • Рекомендации
  • Рецепты
  • Розетки
  • Сервер SOAP
  • Сериализация
  • Сериализация объектов
  • сессии
  • Соглашения о кодировании
  • Создание PDF-файлов в PHP
  • Спектакль
  • Строковый анализ
  • Структуры данных SPL
  • Тестирование устройства
  • Тип жонглирования и нерегулярные проблемы сравнения
  • Тип подсказки
  • Типы
  • Установка в средах Linux / Unix
  • Установка среды PHP в Windows
  • Фильтры и функции фильтра
  • Форматирование строк
  • функции
  • Функции хеширования пароля
  • Функциональное программирование
  • Черты
  • Чтение данных запроса
  • Шаблоны проектирования

Источник

Сохранение в массив (например, с помощью iterator_to_array() )

yield from не сбрасывает ключи. Ключи, возвращённые из объекта Traversable или массива, сохранятся. Таким образом, некоторые значения, могут пересекаться по ключам с другими yield или yield from, что, при записи в массив, повлечёт за собой перезапись прежних значений.

Общий случай, когда это имеет значение, это когда iterator_to_array() возвращает массив с ключами по умолчанию. В этом случае можно получить неожиданный результат. iterator_to_array() имеет второй параметр preserve_keys , который можно установить в false , для генерации собственных ключей и игнорирования ключей, переданных из объекта Generator .

Пример #5 yield from с iterator_to_array()

function inner () yield 1 ; // ключ 0
yield 2 ; // ключ 1
yield 3 ; // ключ 2
>
function gen () yield 0 ; // ключ 0
yield from inner (); // ключи 0-2
yield 4 ; // ключ 1
>
// Задайте false вторым параметром для получения массива [0, 1, 2, 3, 4]
var_dump ( iterator_to_array ( gen ()));
?>

Результат выполнения данного примера:

array(3) < [0]=>int(1) [1]=> int(4) [2]=> int(3) >

Пример #6 Основы использования yield from

function count_to_ten () yield 1 ;
yield 2 ;
yield from [ 3 , 4 ];
yield from new ArrayIterator ([ 5 , 6 ]);
yield from seven_eight ();
yield 9 ;
yield 10 ;
>

function seven_eight () yield 7 ;
yield from eight ();
>

foreach ( count_to_ten () as $num ) echo » $num » ;
>
?>

Результат выполнения данного примера:

Пример #7 yield from и возвращаемые значения

function count_to_ten () yield 1 ;
yield 2 ;
yield from [ 3 , 4 ];
yield from new ArrayIterator ([ 5 , 6 ]);
yield from seven_eight ();
return yield from nine_ten ();
>

function seven_eight () yield 7 ;
yield from eight ();
>

function nine_ten () yield 9 ;
return 10 ;
>

$gen = count_to_ten ();
foreach ( $gen as $num ) echo » $num » ;
>
echo $gen -> getReturn ();
?>

Результат выполнения данного примера:

Источник

Оцените статью