PHP में foreach कैसे काम करता है: लूप की पूरी जानकारी

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

परिचय: foreach सिर्फ syntactic sugar नहीं है

\n\n

हर PHP डेवलपर, चाहे वह शुरुआती हो या एक्सपर्ट, लगभग रोज़ाना foreach का उपयोग करता है। यह बहुत सरल और समझने में आसान लगता है: "array के हर element पर चलो"। लेकिन क्या आपने कभी सोचा है: PHP यह कैसे करता है? एक ही foreach arrays और objects के साथ अलग-अलग व्यवहार क्यों करता है? लूप के अंदर array को बदलने पर कभी-कभी अप्रत्याशित परिणाम क्यों आते हैं?

\n\n

Stack Overflow पर सवाल "How does PHP 'foreach' actually work?" ने हज़ारों व्यूज़ और सैकड़ों वोट प्राप्त किए हैं। यह कोई संयोग नहीं है: इस सरल दिखने वाले operator के पीछे एक जटिल और सुरुचिपूर्ण तंत्र छिपा है। आज हम PHP के दिल में झाँकेंगे और foreach लूप की पूरी संरचना को कदम-दर-कदम समझेंगे।

\n\n

इस लेख के अंत तक, आप न केवल यह समझ जाएंगे कि foreach कैसे काम करता है, बल्कि उन सामान्य गलतियों से बचना भी सीख जाएंगे जो अनुभवी प्रोग्रामर भी करते हैं। चलिए शुरू करते हैं!

\n\n

अध्याय 1: foreach और internal array pointer

\n\n

जब PHP foreach ($array as $value) कोड देखता है, तो वह सिर्फ "indexes पर चलना" शुरू नहीं करता। इसके काम करने के पीछे internal array pointer (आंतरिक array सूचक) होता है। यह एक अदृश्य "तीर" है जो वर्तमान element की ओर इशारा करता है।

\n\n

यह प्रक्रिया कदम-दर-कदम इस प्रकार है:

\n\n
    \n
  1. पॉइंटर रीसेट. PHP reset($array) कॉल करता है — पॉइंटर पहले element पर आ जाता है।
  2. \n
  3. कुंजी और मान पढ़ना. array का वर्तमान element लिया जाता है।
  4. \n
  5. असाइनमेंट. मान $value वेरिएबल में कॉपी किया जाता है (यदि & न हो)।
  6. \n
  7. पॉइंटर शिफ्ट. PHP पॉइंटर को अगले element पर ले जाता है।
  8. \n
  9. दोहराव. चरण 2-4 तब तक चलते हैं जब तक पॉइंटर array के अंत तक न पहुँच जाए।
  10. \n
\n\n

लेकिन एक महत्वपूर्ण बात है: PHP iteration शुरू करने से पहले array की एक कॉपी बनाता है! आइए जानें कि ऐसा क्यों ज़रूरी है।

\n\n

उदाहरण: लूप के अंदर पॉइंटर रीसेट करना

\n\n
<?php\n$array = [10, 20, 30];\n\nforeach ($array as $value) {\n    echo "$value\\n";\n    // पॉइंटर रीसेट करने की कोशिश\n    reset($array);\n}\n// आउटपुट: 10, 20, 30 — reset का foreach पर कोई प्रभाव नहीं\n?>
\n\n

reset() काम क्यों नहीं किया? क्योंकि foreach internal pointer की कॉपी के साथ काम करता है, न कि मूल के साथ। यह जानबूझकर किया गया है ताकि लूप के अंदर array बदलने से iteration खराब न हो।

\n\n

अध्याय 2: foreach by value vs by reference

\n\n

सबसे आम भ्रम का स्रोत है foreach ($array as $value) और foreach ($array as &$value) के बीच का अंतर। आइए इसे स्पष्ट रूप से समझें।

\n\n

foreach by value: हर कदम पर कॉपी

\n\n

जब आप foreach ($array as $value) लिखते हैं, PHP हर iteration पर array के वर्तमान मान को कॉपी करके $value वेरिएबल में डालता है। इसका मतलब है कि $value को बदलने से मूल array पर कोई प्रभाव नहीं पड़ता।

\n\n
<?php\n$array = [1, 2, 3];\nforeach ($array as $value) {\n    $value *= 2; // कॉपी को बदल रहे हैं\n}\nprint_r($array);\n// आउटपुट: [1, 2, 3] — array नहीं बदला\n?>
\n\n

लाभ: सुरक्षित, मूल डेटा खराब नहीं होता।
\nनुकसान: अगर array के elements बड़े objects हैं, तो कॉपी करना महँगा पड़ सकता है। हालाँकि PHP copy-on-write का उपयोग करता है, objects वाले arrays में सिर्फ identifiers (handles) कॉपी होते हैं, objects खुद नहीं।

\n\n

foreach by reference: मूल के साथ काम करें

\n\n

foreach ($array as &$value) सिंटैक्स PHP को element की reference भेजने के लिए कहता है, न कि उसकी कॉपी। अब $value array के element का एक alias बन जाता है।

\n\n
<?php\n$array = [1, 2, 3];\nforeach ($array as &$value) {\n    $value *= 2; // मूल array को बदल रहे हैं\n}\nprint_r($array);\n// आउटपुट: [2, 4, 6] — array बदल गया\n?>
\n\n

लाभ: मेमोरी की बचत, खासकर बड़े arrays के लिए।
\nनुकसान: लूप के बाद $value वेरिएबल अभी भी array के अंतिम element को reference करता है, जो आगे के कोड में समस्या पैदा कर सकता है। हमेशा unset($value) करना याद रखें!

\n\n

अध्याय 3: foreach और objects

\n\n

जब foreach का उपयोग objects के साथ किया जाता है, तो PHP Traversable interface को चेक करता है। अगर object Traversable को implement करता है (जैसे कि Iterator या IteratorAggregate), तो PHP उसकी अपनी iteration लॉजिक का उपयोग करता है।

\n\n

सामान्य objects (जो Traversable implement नहीं करते) के लिए, PHP object के सभी public properties को iterate करता है, जैसे वे एक associative array हों।

\n\n
<?php\nclass User {\n    public $name = 'Rahul';\n    public $age = 25;\n    protected $email = 'rahul@example.com';\n}\n\n$user = new User();\nforeach ($user as $key => $value) {\n    echo "$key: $value\\n";\n}\n// आउटपुट: name: Rahul, age: 25 (protected property नहीं दिखेगी)\n?>
\n\n

निष्कर्ष: foreach को समझना ज़रूरी क्यों है?

\n\n

foreach PHP का सबसे शक्तिशाली और उपयोगी लूप है, लेकिन इसके पीछे की कार्यप्रणाली को समझना आपको एक बेहतर डेवलपर बनाता है। चाहे आप arrays के साथ काम करें, objects के साथ, या references के साथ, सही तरीके से foreach का उपयोग करना आपके कोड को तेज़, सुरक्षित और अधिक पठनीय बनाता है।

\n\n

याद रखें: foreach सिर्फ एक लूप नहीं है — यह PHP के internal data structures के साथ बातचीत करने का एक तरीका है। इसे समझें, और आप PHP में महारत हासिल करने की ओर एक बड़ा कदम बढ़ाएंगे!

ब्लॉग

पुस्तक अनुशंसाएँ