بخش پنجم: حلقهٔ foreach و کار با آرایهها

۵-۱. مقدمه

حلقهٔ foreach مخصوص پیمایش اعضای آرایه است. در درسهای قبلی، حلقههای while و for با استفاده از شمارنده کار میکردند. اما در foreach نیازی به شمارنده نیست؛ حلقه بهطور خودکار روی تمام اعضای آرایه حرکت میکند و مقدار هر عضو را در اختیار برنامه قرار میدهد.

۵-۲. یادآوری کوتاه دربارهٔ آرایه

آرایه مجموعهای از چند مقدار است که زیر یک نام ذخیره میشوند. هر مقدار یک خانه از آرایه را تشکیل میدهد و هر خانه یک کلید (اندیس) دارد.

مثال آرایه در PHP:

<?php
$fruits = array("سیب", "پرتقال", "موز");
?>

در این آرایه:

کلید (اندیس) مقدار
0 سیب
1 پرتقال
2 موز

نکته: در PHP شمارش خانههای آرایه از صفر شروع میشود. بنابراین اولین خانه کلید ۰ و آخرین خانه کلید ۲ دارد.

مطالعهٔ تکمیلی: در PHP دو نوع آرایه داریم: آرایههای عددی (با کلید ۰، ۱، ۲، ...) و آرایههای انجمنی (با کلیدهای متنی مانند "نام" => "علی"). حلقهٔ foreach با هر دو نوع کار میکند. این موضوع در ادامه توضیح داده میشود، اما دانستن جزئیات آن برای شروع الزامی نیست.

۵-۳. ساختار حلقهٔ foreach

حلقهٔ foreach دو شکل اصلی دارد.

شکل اول: فقط مقدار

<?php
foreach ($آرایه as $مقدار) {
    // دستوراتی که با هر مقدار اجرا میشوند
}
?>

شکل دوم: کلید و مقدار

<?php
foreach ($آرایه as $کلید => $مقدار) {
    // دستوراتی که با هر کلید و مقدار اجرا میشوند
}
?>

اجزای این ساختار:

  1. کلمهٔ کلیدی foreach
  2. نام آرایه
  3. کلمهٔ کلیدی as
  4. متغیری که مقدار هر خانه در آن قرار میگیرد (و در صورت نیاز، متغیری برای کلید)
  5. بدنهٔ حلقه داخل آکولاد { }

۵-۴. نحوهٔ اجرا

حلقهٔ foreach به ترتیب زیر کار میکند:

  1. اولین خانهٔ آرایه انتخاب میشود.
  2. مقدار آن خانه در متغیر مشخصشده قرار میگیرد.
  3. بدنهٔ حلقه اجرا میشود.
  4. به خانهٔ بعدی آرایه میرود و همین روند را تکرار میکند.
  5. وقتی تمام خانهها پیمایش شدند، حلقه پایان مییابد.

نکتهٔ مهم: در 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 خطای نحوی
استفاده از نام متغیر تکراری برای آرایه و مقدار رفتار نامشخص
انتظار تغییر آرایه بدون استفاده از ارجاع آرایه تغییر نمیکند
فراموش کردن آکولاد در بدنهٔ چنددستوری فقط اولین دستور تکرار میشود

۵-۱۳. فعالیت کلاسی

  1. آرایهای از نام پنج میوه بسازید و با foreach آنها را چاپ کنید.
  2. آرایهای از نمرات پنج دانشآموز بسازید و با foreach میانگین آنها را حساب کنید.
  3. آرایهای انجمنی از اطلاعات یک کتاب (عنوان، نویسنده، سال انتشار) بسازید و با foreach کلید و مقدار را چاپ کنید.
  4. آرایهای از اعداد بسازید و با foreach فقط اعداد بزرگتر از ۱۰ را چاپ کنید.