परिचय
foreach जैसे लूपिंग कंस्ट्रक्ट का उपयोग करके डेटा के बड़े संग्रह को पार करने के लिए बड़ी मेमोरी और काफी प्रोसेसिंग समय की आवश्यकता होगी। जेनरेटर्स के साथ, इन ओवरहेड्स के बिना डेटा के एक सेट पर इटरेट करना संभव है। एक जेनरेटर फंक्शन एक सामान्य फंक्शन के समान होता है। हालांकि, फंक्शन में return स्टेटमेंट के बजाय, जेनरेटर yield कीवर्ड का उपयोग करता है जिसे बार-बार निष्पादित किया जाता है ताकि इटरेट किए जाने वाले मान प्रदान किए जा सकें।
yield कीवर्ड जेनरेटर तंत्र का दिल है। भले ही इसका उपयोग return के समान प्रतीत होता है, यह फंक्शन के निष्पादन को नहीं रोकता। यह इटरेशन के लिए अगला मान प्रदान करता है और फंक्शन के निष्पादन को रोक देता है।
मान यील्ड करना
एक for लूप जेनरेटर फंक्शन के अंदर लूपिंग वेरिएबल के प्रत्येक मान को यील्ड करता है।
उदाहरण 1: सरल जेनरेटर
<?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
उदाहरण 2: range() फंक्शन को जेनरेटर के रूप में इम्प्लीमेंट करना
PHP का range() फंक्शन $start से $stop तक $step अंतराल के साथ इंटीजर्स की सूची लौटाता है। निम्न प्रोग्राम 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 . " ";
}
?>
आउटपुट
2 4 6 8 10
उदाहरण 3: एसोसिएटिव एरे जेनरेटर
एक एसोसिएटिव एरे को भी जेनरेटर के रूप में इम्प्लीमेंट किया जा सकता है:
<?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
मुख्य लाभ
- मेमोरी कुशल: पूरी सरणी मेमोरी में बनाने की आवश्यकता नहीं।
- आलसी मूल्यांकन: मान केवल मांग पर उत्पन्न होते हैं।
- बड़े डेटासेट्स: बड़ी फाइलें, डेटाबेस रिजल्ट्स, API पेजिनेशन के लिए आदर्श।
- कॉम्पोजिशन: जेनरेटर्स को चेन किया जा सकता है (yield from)।
yield from (PHP 7.0+)
function combined() {
yield from generator1();
yield from generator2();
yield "extra";
}