परिचय: क्यों foreach सिर्फ "प्रत्येक के लिए" नहीं है
\n\nयदि आप कम से कम एक सप्ताह से PHP में कोड लिख रहे हैं, तो आपने foreach का सौ बार उपयोग किया होगा। यह शायद हर डेवलपर का सबसे पसंदीदा लूप है: छोटा, सुरुचिपूर्ण, बिना किसी अतिरिक्त काउंटर के। लेकिन क्या आपने कभी सोचा है कि जब आप foreach ($array as $value) लिखते हैं तो वास्तव में हुड के नीचे क्या होता है?
प्रश्न "How does PHP 'foreach' actually work?" ने Stack Overflow पर हजारों व्यूज प्राप्त किए हैं। और यह कोई संयोग नहीं है। foreach का व्यवहार कई आश्चर्य छुपाता है, खासकर जब रेफरेंस, नेस्टेड लूप और गैर-मानक ऐरे की बात आती है।
इस ट्यूटोरियल में हम सिर्फ सिंटैक्स नहीं दोहराएंगे। हम PHP इंजन के अंदर झांकेंगे, आंतरिक ऐरे पॉइंटर को समझेंगे, देखेंगे कि इटरेटर कैसे काम करते हैं, और खतरनाक स्थितियों से बचना सीखेंगे। चलिए शुरू करते हैं!
\n\n1. foreach की शारीरिक रचना: डॉक्यूमेंटेशन क्या कहता है
\n\nआइए बुनियादी बातों से शुरू करें। foreach ऐरे और ऑब्जेक्ट्स को पार करने के लिए डिज़ाइन किया गया है। सिंटैक्स सरल है:
<?php\n$fruits = ['apple', 'banana', 'cherry'];\n\nforeach ($fruits as $fruit) {\n echo $fruit . "\\n";\n}\n// आउटपुट: apple banana cherry\n?>\n\nलेकिन एक दूसरा रूप भी है - कुंजी के साथ:
\n\n<?php\n$prices = ['apple' => 100, 'banana' => 50];\n\nforeach ($prices as $name => $price) {\n echo "$name की कीमत $price रुपये है।\\n";\n}\n?>\n\nसब कुछ स्पष्ट लगता है। लेकिन आइए गहराई से खोदें। PHP foreach को for या while की तरह प्रोसेस नहीं करता है। अंदरूनी रूप से, यह आंतरिक ऐरे पॉइंटर (internal array pointer) और एक विशेष इटरेशन तंत्र का उपयोग करता है।
2. आंतरिक ऐरे पॉइंटर: गुप्त एजेंट
\n\nPHP में प्रत्येक ऐरे में एक अदृश्य "कर्सर" होता है - आंतरिक पॉइंटर। यह वर्तमान तत्व को इंगित करता है। फंक्शन current(), next(), prev(), end() और reset() इसी को नियंत्रित करते हैं।
जब आप foreach चलाते हैं, तो PHP निम्न कार्य करता है:
- \n
- आंतरिक पॉइंटर को पहले तत्व पर रीसेट करता है (
reset()की तरह)। \n - प्रत्येक इटरेशन पर, पॉइंटर जिस तत्व को इंगित कर रहा है, उसे लेता है। \n
- पॉइंटर को अगले तत्व पर ले जाता है (
next()की तरह)। \n - अंत तक पहुँचने तक दोहराता है। \n
आइए इसे क्रिया में देखें:
\n\n<?php\n$array = [10, 20, 30];\n\n// foreach की मैन्युअल नकल\nreset($array); // पॉइंटर पहले तत्व पर\nwhile ($value = current($array)) {\n echo $value . " ";\n next($array); // पॉइंटर को आगे बढ़ाएँ\n}\n// आउटपुट: 10 20 30\n?>\n\nलेकिन एक बारीकी है: यदि ऐरे खाली है या इसमें false है, तो यह ट्रिक विफल हो जाएगी। foreach हमेशा सही ढंग से काम करता है, क्योंकि यह अधिक विश्वसनीय आंतरिक तंत्र - इटरेटर का उपयोग करता है।
3. इटरेटर और foreach: आधुनिक दृष्टिकोण
\n\nPHP 5 से शुरू करके, foreach न केवल ऐरे के साथ, बल्कि किसी भी ऑब्जेक्ट के साथ काम कर सकता है जो Traversable इंटरफ़ेस (या इसके वंशज Iterator) को लागू करता है।
जब आप foreach में एक ऑब्जेक्ट पास करते हैं, तो PHP इटरेटर के तरीकों को कॉल करता है:
- \n
rewind()- शुरुआत में रीसेट करें \n valid()- जाँचें कि कोई तत्व है या नहीं \n current()- मान प्राप्त करें \n key()- कुंजी प्राप्त करें \n next()- अगले पर जाएँ \n
उपयोगकर्ता-परिभाषित इटरेटर का उदाहरण:
\n\n<?php\nclass NumbersIterator implements Iterator {\n private $position = 0;\n private $numbers = [1, 2, 3, 4, 5];\n\n public function rewind() {\n $this->position = 0;\n }\n\n public function current() {\n return $this->numbers[$this->position];\n }\n\n public function key() {\n return $this->position;\n