소개
foreach와 같은 반복 구문을 사용하여 방대한 데이터 컬렉션 탐색 대용량 메모리와 상당한 처리 시간이 필요합니다. 발전기 사용 이러한 오버헤드 없이 데이터 세트를 반복할 수 있습니다. 제너레이터 함수는 일반 함수와 유사합니다. 그러나 함수의 return 문 대신 제너레이터는 yield를 사용합니다. 반복할 값을 제공하기 위해 반복적으로 실행되는 키워드입니다.
yield 키워드는 생성기 메커니즘의 핵심입니다. 사용법은 return과 비슷해 보이지만 함수의 실행을 멈추지 않는다. 반복을 위한 다음 값을 제공하고 함수의 실행을 일시 중지합니다.
값을 산출
for 루프는 생성기 함수 내부에서 사용되는 루프 변수의 각 값을 산출합니다.
예시
<?php function squaregenerator(){ for ($i=1; $i<=5; $i++){ yield $i*$i; } } $gen=squaregenerator(); foreach ($gen as $val){ echo $val . " "; } ?>
foreach 문이 처음으로 $val을 표시하려고 할 때 squaregenerator는 첫 번째 요소를 생성하고 $i를 유지하고 foreach가 다음 반복을 수행할 때까지 실행을 일시 중지합니다. 출력은 일반 foreach 루프와 유사합니다.
출력
1 4 9 16 25
PHP의 range() 함수는 각 숫자 사이에 $step 간격으로 $start에서 $stop까지의 정수 목록을 반환합니다. 다음 프로그램은 생성기로 range()를 구현합니다.
예시
<?php function rangegenerator($start, $stop, $step){ for ($i=$start; $i<=$stop; $i+=$step){ yield $i; } } foreach (rangegenerator(2,10,2) as $val){ echo $val . " "; } ?>
출력
출력은 range(2,20,2)와 유사합니다.
2 4 6 8 10
연관 배열은 생성기로도 구현할 수 있습니다.
예시
<?php function arrgenerator($arr){ foreach ($arr as $key=>$val){ yield $key=>$val; } } $arr=array("one"=>1, "two"=>2, "three"=>3, "four"=>4); $gen=arrgenerator($arr); foreach ($gen as $key=>$val) echo $key . "=>" . $val . "\n"; ?>
출력
one=>1 two=>2 three=>3 four=>4