بخش پنجم: حلقهٔ foreach و کار با آرایهها
۵-۱. مقدمه
حلقهٔ foreach مخصوص پیمایش اعضای آرایه است. در درسهای قبلی، حلقههای while و for با استفاده از شمارنده کار میکردند. اما در foreach نیازی به شمارنده نیست؛ حلقه بهطور خودکار روی تمام اعضای آرایه حرکت میکند و مقدار هر عضو را در اختیار برنامه قرار میدهد.
۵-۲. یادآوری کوتاه دربارهٔ آرایه
آرایه مجموعهای از چند مقدار است که زیر یک نام ذخیره میشوند. هر مقدار یک خانه از آرایه را تشکیل میدهد و هر خانه یک کلید (اندیس) دارد.
مثال آرایه در PHP:
<?php
$fruits = array("سیب", "پرتقال", "موز");
?>
در این آرایه:
| کلید (اندیس) | مقدار |
|---|---|
| 0 | سیب |
| 1 | پرتقال |
| 2 | موز |
نکته: در PHP شمارش خانههای آرایه از صفر شروع میشود. بنابراین اولین خانه کلید ۰ و آخرین خانه کلید ۲ دارد.
مطالعهٔ تکمیلی: در PHP دو نوع آرایه داریم: آرایههای عددی (با کلید ۰، ۱، ۲، ...) و آرایههای انجمنی (با کلیدهای متنی مانند
"نام" => "علی"). حلقهٔforeachبا هر دو نوع کار میکند. این موضوع در ادامه توضیح داده میشود، اما دانستن جزئیات آن برای شروع الزامی نیست.
۵-۳. ساختار حلقهٔ foreach
حلقهٔ foreach دو شکل اصلی دارد.
شکل اول: فقط مقدار
<?php
foreach ($آرایه as $مقدار) {
// دستوراتی که با هر مقدار اجرا میشوند
}
?>
شکل دوم: کلید و مقدار
<?php
foreach ($آرایه as $کلید => $مقدار) {
// دستوراتی که با هر کلید و مقدار اجرا میشوند
}
?>
اجزای این ساختار:
- کلمهٔ کلیدی
foreach - نام آرایه
- کلمهٔ کلیدی
as - متغیری که مقدار هر خانه در آن قرار میگیرد (و در صورت نیاز، متغیری برای کلید)
- بدنهٔ حلقه داخل آکولاد
{ }
۵-۴. نحوهٔ اجرا
حلقهٔ foreach به ترتیب زیر کار میکند:
- اولین خانهٔ آرایه انتخاب میشود.
- مقدار آن خانه در متغیر مشخصشده قرار میگیرد.
- بدنهٔ حلقه اجرا میشود.
- به خانهٔ بعدی آرایه میرود و همین روند را تکرار میکند.
- وقتی تمام خانهها پیمایش شدند، حلقه پایان مییابد.
نکتهٔ مهم: در foreach نیازی به تعیین شرط یا افزایش شمارنده نیست. حلقه خودبهخود همهٔ اعضا را پیمایش میکند.
۵-۵. مثال اول: چاپ اعضای آرایه
<?php
$fruits = array("سیب", "پرتقال", "موز");
foreach ($fruits as $fruit) {
echo $fruit . "<br>";
}
?>
خروجی:
سیب
پرتقال
موز
توضیح اجرا:
- در تکرار اول، مقدار
$fruitبرابر"سیب"میشود و چاپ میشود. - در تکرار دوم، مقدار
$fruitبرابر"پرتقال"میشود و چاپ میشود. - در تکرار سوم، مقدار
$fruitبرابر"موز"میشود و چاپ میشود. - سپس حلقه پایان مییابد.
۵-۶. مثال دوم: چاپ کلید و مقدار
<?php
$fruits = array("سیب", "پرتقال", "موز");
foreach ($fruits as $key => $fruit) {
echo "کلید: " . $key . " — مقدار: " . $fruit . "<br>";
}
?>
خروجی:
کلید: 0 — مقدار: سیب
کلید: 1 — مقدار: پرتقال
کلید: 2 — مقدار: موز
در این مثال، متغیر $key کلید هر خانه و متغیر $fruit مقدار آن خانه را نگه میدارد.
۵-۷. مثال سوم: آرایهٔ عددی و محاسبهٔ مجموع
<?php
$numbers = array(10, 20, 30, 40);
$sum = 0;
foreach ($numbers as $number) {
$sum = $sum + $number;
}
echo "مجموع اعضای آرایه: " . $sum;
?>
خروجی:
مجموع اعضای آرایه: 100
در این مثال:
- متغیر
$sumابتدا صفر است. - در هر تکرار، مقدار یکی از خانههای آرایه به
$sumاضافه میشود. - پس از پیمایش همهٔ خانهها، مقدار نهایی چاپ میشود.
۵-۸. مثال چهارم: آرایهٔ انجمنی
آرایهٔ انجمنی آرایهای است که کلیدهای آن عدد نیستند، بلکه متن هستند.
<?php
$student = array(
"نام" => "علی",
"سن" => 17,
"رشته" => "کامپیوتر"
);
foreach ($student as $key => $value) {
echo $key . ": " . $value . "<br>";
}
?>
خروجی:
نام: علی
سن: 17
رشته: کامپیوتر
در این مثال، هر خانه یک کلید متنی دارد. حلقهٔ foreach کلید و مقدار را به ترتیب چاپ میکند.
۵-۹. مثال پنجم: چاپ اعداد زوج آرایه
<?php
$numbers = array(3, 8, 12, 7, 20, 15);
foreach ($numbers as $number) {
if ($number % 2 == 0) {
echo $number . "<br>";
}
}
?>
خروجی:
8
12
20
در این مثال، شرط داخل حلقه بررسی میکند که آیا عدد بخشپذیر بر ۲ است یا خیر. فقط اعداد زوج چاپ میشوند.
۵-۱۰. مقایسهٔ foreach با for در آرایهها
| ویژگی | foreach |
for |
|---|---|---|
| نیاز به شمارنده | ندارد | دارد |
| طول آرایه باید مشخص باشد | خیر | بله |
| خوانایی برای پیمایش آرایه | بیشتر | کمتر |
| امکان تغییر مقدار خانهها | دارد (با ارجاع) | دارد |
| کاربرد اصلی | پیمایش آرایه | تکرار شمارشی |
مثال مقایسه:
با for:
<?php
$fruits = array("سیب", "پرتقال", "موز");
for ($i = 0; $i < count($fruits); $i++) {
echo $fruits[$i] . "<br>";
}
?>
با foreach:
<?php
$fruits = array("سیب", "پرتقال", "موز");
foreach ($fruits as $fruit) {
echo $fruit . "<br>";
}
?>
هر دو کد خروجی یکسان دارند. اما کد foreach کوتاهتر و خواناتر است. همچنین اگر تعداد اعضای آرایه تغییر کند، کد foreach بدون تغییر کار میکند.
مطالعهٔ تکمیلی: تابع
count()تعداد اعضای آرایه را برمیگرداند. در حلقهٔforبرای پیمایش آرایه به این تابع نیاز داریم. این موضوع برای درک مقایسه بیان شد و دانستن جزئیات آن الزامی نیست.
۵-۱۱. تغییر مقدار خانههای آرایه با foreach
در حالت عادی، foreach یک کپی از مقدار هر خانه را در اختیار برنامه قرار میدهد. بنابراین تغییر متغیر داخل حلقه، مقدار اصلی آرایه را تغییر نمیدهد.
مثال (بدون تأثیر روی آرایه):
<?php
$numbers = array(1, 2, 3);
foreach ($numbers as $number) {
$number = $number * 2;
}
print_r($numbers);
?>
خروجی:
Array
(
[0] => 1
[1] => 2
[2] => 3
)
مقدار آرایه تغییر نکرده است.
نکته: برای تغییر مقدار خانههای آرایه، باید از علامت & (ارجاع) استفاده کرد. این موضوع در بخش مطالعهٔ تکمیلی توضیح داده میشود.
مطالعهٔ تکمیلی: با نوشتن
foreach ($numbers as &$number)میتوان مقدار خانههای آرایه را مستقیماً تغییر داد. پس از پایان حلقه، باید باunset($number)ارجاع را آزاد کرد. این موضوع برای دانشآموزان الزامی نیست و فقط برای آشنایی بیان میشود.
۵-۱۲. اشتباههای رایج
| اشتباه | نتیجه |
|---|---|
استفاده از foreach روی متغیری که آرایه نیست |
خطا |
فراموش کردن کلمهٔ as |
خطای نحوی |
| استفاده از نام متغیر تکراری برای آرایه و مقدار | رفتار نامشخص |
| انتظار تغییر آرایه بدون استفاده از ارجاع | آرایه تغییر نمیکند |
| فراموش کردن آکولاد در بدنهٔ چنددستوری | فقط اولین دستور تکرار میشود |
۵-۱۳. فعالیت کلاسی
- آرایهای از نام پنج میوه بسازید و با
foreachآنها را چاپ کنید. - آرایهای از نمرات پنج دانشآموز بسازید و با
foreachمیانگین آنها را حساب کنید. - آرایهای انجمنی از اطلاعات یک کتاب (عنوان، نویسنده، سال انتشار) بسازید و با
foreachکلید و مقدار را چاپ کنید. - آرایهای از اعداد بسازید و با
foreachفقط اعداد بزرگتر از ۱۰ را چاپ کنید.