প্রথম foreach লুপ পরে, $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]; }
একটি অগ্রণী লুপ প্রকৃতিতে বিশেষ নয় যেখানে এটি রেফারেন্সড আইটেমগুলিকে উপেক্ষা করতে পারে। এটি প্রতিটি বারের মতো আপনি যে লুপের বাইরে যাবেন ঠিক তেমন পরিবর্তনশীলটিকে নতুন মানটিতে সেট করে।