PHP: yield в для создания генератора

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

Когда выполнение функции доходит до yield, функция возвращает значение генератору и приостанавливает своё выполнение, сохраняя состояние всех локальных переменных. При следующем вызове генератора выполнение продолжается с того места, где оно было приостановлено.

Пример:

В этом примере generate_numbers - это функция-генератор, которая принимает два аргумента - начальное и конечное значение. Она содержит цикл for, который перебирает все числа от $start до $end и каждое число возвращает с помощью оператора yield.

При вызове функции generate_numbers(1, 10) создается объект-генератор, который можно перебирать с помощью цикла foreach. В этом цикле для каждого значения, возвращенного генератором, вызывается echo. Результат выполнения этого примера будет вывод чисел от 1 до 10 через пробел.

function generate_numbers( $start, $end )
{
    for( $i = $start; $i <= $end; $i++ )
	{
        yield $i;
    }
}

foreach( generate_numbers( 1, 10 ) as $number )
{
    echo $number . ' ';
}

Генераторы позволяют вам не загружать весь файл в память, что очень удобно при работе с большими файлами. Вот пример функции, которая использует yield для чтения большого CSV-файла построчно: функция readCsv открывает файл и читает его построчно, используя fgetcsv. Она использует yield для возврата текущей строки из файла. Это позволяет вызывающему коду обрабатывать строки файла одну за другой без необходимости загружать весь файл в память.

function readCsv( $fileName )
{
	if( !file_exists( $fileName ) || !is_readable( $fileName ) )
	{
		return;
	}

	$handle = fopen( $fileName, 'r' );

	while( !feof( $handle ) )
	{
		$data = fgetcsv( $handle );
		if( $data === false )
		{
			continue;
		}
		yield $data;
	}

	fclose( $handle );
}

$csvFileName = 'large_file.csv';

foreach( readCsv( $csvFileName ) as $rowIndex => $row )
{
	echo "Строка $rowIndex: " . implode(', ', $row) . PHP_EOL;
}
up: 2.7 г. Просмотров: 1k
Материал помог? Оценка помогает находить устаревшие и спорные решения.

Комментарии

0

Нашли ошибку или хотите дополнить материал?

Комментариев пока нет.Можно первым дополнить материал или сообщить об ошибке.
Telegram