पहले फॉरेस्ट लूप के बाद, $itemअभी भी कुछ मूल्य का संदर्भ है जिसका उपयोग भी किया जा रहा है $arr[2]। इसलिए प्रत्येक फॉर्च्यूनर दूसरे लूप में कॉल करता है, जो संदर्भ से कॉल नहीं करता है, उस मूल्य को बदलता है, और इस प्रकार $arr[2], नए मूल्य के साथ।
तो लूप 1, मान और $arr[2]बन गया $arr[0], जो 'फू' है।
लूप 2, मान और $arr[2]बनो $arr[1], जो 'बार' है।
लूप 3, मान और $arr[2]बनें $arr[2], जो 'बार' (लूप 2 के कारण) है।
मूल्य 'बाज' वास्तव में दूसरे फॉरेक्स लूप के पहले कॉल पर खो गया है।
आउटपुट को डीबग करना
लूप के प्रत्येक पुनरावृत्ति के लिए, हम $itemसरणी को प्रिंट करने के साथ-साथ मूल्य को भी प्रतिध्वनित करेंगे $arr।
जब पहले लूप के माध्यम से चलाया जाता है, तो हम इस आउटपुट को देखते हैं:
foo
Array ( [0] => foo [1] => bar [2] => baz )
bar
Array ( [0] => foo [1] => bar [2] => baz )
baz
Array ( [0] => foo [1] => bar [2] => baz )
लूप के अंत में, $itemअभी भी उसी स्थान की ओर इशारा कर रहा है $arr[2]।
जब दूसरा लूप चलाया जाता है, तो हम इस आउटपुट को देखते हैं:
foo
Array ( [0] => foo [1] => bar [2] => foo )
bar
Array ( [0] => foo [1] => bar [2] => bar )
bar
Array ( [0] => foo [1] => bar [2] => bar )
आप देखेंगे कि हर बार सरणी किस प्रकार नया मान डालती है $item, यह भी $arr[3]उसी मान से अपडेट होता है, क्योंकि वे दोनों अभी भी उसी स्थान की ओर इशारा कर रहे हैं। जब लूप ऐरे के तीसरे मान पर जाता है, तो इसमें वह मान होगा barक्योंकि यह उस लूप के पिछले पुनरावृत्ति द्वारा सेट किया गया था।
यह एक बग है?
नहीं, यह एक संदर्भित आइटम का व्यवहार है, और बग नहीं है। यह कुछ चलाने के समान होगा:
for ($i = 0; $i < count($arr); $i++) { $item = $arr[$i]; }
एक फॉरेस्ट लूप प्रकृति में विशेष नहीं है जिसमें वह संदर्भित वस्तुओं को अनदेखा कर सकता है। यह बस उस चर को हर बार नए मूल्य पर सेट कर रहा है जैसे आप एक लूप के बाहर।