سرفصل‌های آموزشی
آموزش PHP
آشنایی با ساختار حلقهٔ foreach در زبان PHP

آشنایی با ساختار حلقهٔ foreach در زبان PHP

در آموزش گذشته دیدیم که با استفاده از اندیس‌ها، به چه شکل می‌توانستیم به تک‌تک خانه‌های یک آرایه دست پیدا کنیم اما این در حالی است که گاهی‌اوقات ما نیاز داریم تا کلیهٔ خانه‌های (اعضای) یک آرایه را در اختیار داشته و در معرض دید کاربر قرار دهیم که برای این منظور بایستی با مفهوم Loop (لوپ یا حلقه) آشنا شویم. به طور کلی، در زبان PHP انواع مختلفی لوپ وجود دارد که عبارتند از:

  • foreach
  • for
  • while
  • do while

که در این آموزش به صورت عملی با مفهوم، ساختار و کاربرد حلقهٔ foreach آشنا شده و در آموزش‌های آتی به بررسی دیگر انواع لوپ در این زبان خواهیم پرداخت.

آشنایی با حلقهٔ foreach در زبان PHP

در زبان PHP ساختاری تحت عنوان foreach وجود دارد که به منظور دستیابی به تمامی اِلِمان‌های یک آرایه مورد استفاده قرار می‌گیرد. ساختار کلی foreach به صورت زیر است:

foreach ($array as $key => $value) {
    // Do something with $value.
}

همان‌طور که مشاهده می‌شود، حلقهٔ foreach آرایه‌ای همچون array$ را به عنوان پارامتر ورودی می‌گیرد؛ سپس کلیدواژه‌ای تحت عنوان as که به صورت پیش‌فرض در این زبان تعریف شده را نوشته و نام‌هایی دلخواه برای اندیس‌ها و مقادیرشان در نظر می‌گیریم (در این مثال، از متغیر key$ برای ذخیره‌سازی کلید یا اندیس و از متغیر value$ برای ذخیره‌سازی مقدار استفاده شده است). نکته‌ای که در ارتباط با لوپ زدن روی یک آرایه وجود دارد این است که می‌توان صرفاً مقادیر را چاپ کرد. به عبارت دیگر:

foreach ($array as $value) {
    // Do something with $value.
}

می‌بینیم که متغیری که قرار بود اندیس‌ها را در خود ذخیره سازد را حذف کرده و صرفاً از این پس مقادیر خانه‌های آرایه را در اختیار خواهیم داشت.

همچنین توجه داشته باشید که چنانچه تصمیم گرفتید تا هم اندیس‌ها و هم مقادیر را از آرایهٔ مد نظر استخراج کنید، مابین متغیری که قرار است اندیس را در خود ذخیره سازد با متغیری که قرار است مقدار آن اندیس را در خود ذخیره سازد از علامت <= استفاده نمایید.

    هشدار 
همواره توصیه می‌شود که از نام‌های بامسمی برای ذخیره‌سازی اندیس‌ها و مقادیر استفاده شود. به طور مثال اگر فرض کنیم که آرایه‌ای داریم تحت عنوان users$ که حاوی دیتای مرتبط با کاربران وب‌سایت است و قصد داریم با استفاده از یک لوپ به اطلاعات تک‌تک کاربران دست یابیم، بهتر است از متغیری تحت عنوان userId$ برای ذخیره‌سازی کلید و userInfo$ به منظور ذخیره‌سازی اطلاعات مرتبط با هر شناسه استفاده کرد.

برای روشن‌تر شدن کاربرد عملی حلقه‌ها، آرایه‌ای به صورت زیر را مبنا قرار داده، سپس با استفاده از یک لوپ اقدام به چاپ تک‌تک اعضای آن آرایه می‌کنیم:

<?php
$array = ['PHP', 'Java', 'Python', 'C#'];
foreach ($array as $key => $value) {
    echo $key . ' is ' . $value . '<br>';
}

خروجی این اسکریپت برابر است با:

0 is PHP
1 is Java
2 is Python
3 is C#

در تفسیر کدهای فوق بایستی بگوییم که آرایه‌ای ساخته‌ایم تحت عنوان array$ که حاوی نام تعدادی از زبان‌های برنامه‌نویسی محبوب است؛ سپس با استفاده از یک حلقهٔ foreach قصد داریم تا تک‌تک اعضای این آرایه را با استفاده از دستور echo چاپ کنیم. برای این منظور، متغیرهای key$ و value$ را نوشته و در نهایت از یک تگ <br> استفاده کرده تا هر عضو در خطی مجزا چاپ شود.

در حقیقت، foreach این وظیفه را دارا است تا آن‌قدر در آرایهٔ array$ بچرخد و اعضای آن را چاپ کند تا اینکه دیگر هیچ چیزی داخل آرایه باقی نمانده باشد. همان‌طور که قبلاً اشاره شد، همچنین می‌توانیم به سادگی اندیس‌ها را از خروجی حذف کرده و صرفاً مقادیر را مد نظر قرار دهیم:

<?php
$array = ['PHP', 'Java', 'Python', 'C#'];
foreach ($array as $value) {
    echo $value . '<br>';
}

به عنوان خروجی داریم:

PHP
Java
Python
C#

استفاده از دستورات شرطی در داخل لوپ‌ها

گاهی‌اوقات بسته به Business Logic وب اپلیکیشن خود، نیاز داریم تا شرط‌های خاصی را داخل لوپ‌ها اعمال کنیم که این کار در زبان PHP به سادگی امکان‌پذیر است (منظور از این اصطلاح کاربرد واقعی نرم‌افزار است). به عنوان مثال داریم:

<?php
$array = ['PHP', 'Java', 'Python', 'C#'];
foreach ($array as $value) {
    if ($value == 'Java') {
        continue;
    }
    echo $value . '<br>';
}

و خروجی اسکریپت فوق برابر است با:

PHP
Python
C#

در حقیقت کاری که انجام داده‌ایم این است که دستور داده‌ایم این لوپ ادامه یابد و به محض اینکه به مقداری برابر با استرینگ Java رسید، آن را رد کرده و به ادامهٔ چرخش بپردازد (توجه داشته باشید که کلمهٔ Java با حرف اول بزرگ نوشته شده و چنانچه داخل دستور if از استرینگ java استفاده کنیم، شرط هرگز برقرار نخواهد شد). همچنین این امکان را داریم تا بسته به شرط خاصی، لوپ را متوقف سازیم؛ به عنوان نمونه داریم:

<?php
$array = ['PHP', 'Java', 'Python', 'C#'];
foreach ($array as $value) {
    if ($value == 'Python') {
        break;
    }
    echo $value . '<br>';
}

به عنوان خروجی اسکریپت فوق داریم:

PHP
Java

در حقیقت کاری که انجام داده‌ایم این است که دستور داده‌ایم این حلقه ادامه یابد اما به محض اینکه به مقداری برابر با استرینگ Python رسید، این حلقه از ادامهٔ کار باز ایستد و چنین قابلیتی به خاطر استفاده از کیورد break است (همان‌طور که از نام این کلیدواژه برمی‌آید، حلقه به محض رسیدن به شرط مذکور، شکسته شده و دیگر ادامه نخواهد یافت).

استفاده از مفاهیم آرایه و حلقه برای ایجاد یک منوی تاریخ

حال برای آنکه به طور عملی با کاربرد حلقه‌ها در کدنویسی اپلیکیشن‌های تحت وب آشنا شوید، قصد داریم در ادامه یک منوی تاریخ را با استفاده از آرایه‌ای از ماه‌های میلادی در معرض دید کاربر قرار دهیم. برای این منظور ابتدا کدها را نوشته سپس خروجی را مد نظر قرار داده و در نهایت به تفسیر کدها خواهیم پرداخت:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Date Form</title>
    </head>
    <body>
        <form>
            <?php
                $days = range(1, 31);
                $months = [1 => 'January', 2 => 'February', 3 => 'March', 4 => 'April', 5 => 'May', 6 => 'June', 7 => 'July', 8 => 'August', 9 => 'September', 10 => 'October', 11 => 'November', 12 => 'December'];
                $years = range (2018, 2028);
            ?>
            <select name="day">
                <?php
                    foreach ($days as $day) {
                        echo "<option value='$day'>$day</option>";
                    }
                ?>
            </select>
            <select name="month">
                <?php
                    foreach ($months as $monthKey => $month) {
                        echo "<option value='$monthKey'>$month</option>";
                    }
                ?>
            </select>
            <select name="year">
                <?php
                    foreach ($years as $year) {
                        echo "<option value='$year'>$year</option>";
                    }
                ?>
            </select>
        </form>
    </body>
</html>

چنانچه اسکریپت فوق را از طریق لوکال‌هاست در مرورگر باز کنیم، می‌بینیم که فرمی در اختیار ما قرار گرفته که با استفاده از آن می‌توانیم روز، ماه و سال مد نظر خود را انتخاب کنیم. چنانچه به سورس این صفحه نگاه کنیم صرفاً کدهای HTML می‌بینیم، اما این در حالی است که مقادیر تگ‌های select به صورت کاملاً دینامیک (پویا) و با استفاده از زبان PHP ایجاد شده‌اند.

آنچه در اسکریپت فوق نیاز به توضیح دارد این است که داخل تگ‌ form تگ‌های آغازین و پایانی پی‌اچ‌پی را ایجاد کرده و داخل آن‌ها سه آرایه تحت عناوین months ،$days$ و years$ ایجاد کرده‌ایم. 

در اینجا بایستی با یکی از توابع از پیش تعریف شده در زبان PHP تحت عنوان ()range آشنا شد. کاری که این فانکشن انجام می‌دهد این است که بر اساس نقطهٔ آغازین (پارامتر اول) و نقطهٔ پایانی (پارامتر دوم)، آرایه‌ای شامل طیفی از اعداد را برایمان ایجاد می‌کند که ترتیب آن‌ها از کوچک به بزرگ است. به طور مثال، در متغیر days$ طیفی از اعداد ۱ تا ۳۱ ایجاد شده و داخل این متغیر ذخیره می‌شود (به همین منوال، طیفی از سال ۲۰۱۸ تا ۲۰۲۸ را در متغیر years$ ذخیره کرده‌ایم).

در متغیر months$ هم آرایه‌ای از ماه‌های میلادی را ایجاد کرده‌ایم اما از آنجا که اندیس‌های آرایه در زبان PHP به صورت پیش‌فرض از عدد صفر شروع می‌شود، اندیس‌گذاری را هم خود به صورت دستی از عدد یک شروع کرده‌ایم چرا که به طور مثال، به عنوان عدد مرتبط با ماه January به عدد یک نیاز داریم نه صفر.

سپس در ادامه از سه تگ select استفاده کرده اما تگ‌های option داخل آن‌ها را به صورت دینامیک و با استفاده از آرایه‌هایی که پیش از این تعریف کردیم و ساختار foreach ایجاد کرده‌ایم.

برخلاف تگ‌های مرتبط با روز و سال که صرفاً به مقادیر نیاز داشتیم، در تگ مرتبط با ماه از دو متغیر به نام‌های monthKey$ و month$ به ترتیب برای نشان دادن معادل عددی ماه‌ها و معادل الفبایی ماه‌ها استفاده کرده‌ایم. حال نگاهی به خروجی صفحهٔ فوق می‌اندازیم:

<!DOCTYPE html>
<html>
   <head>
      <meta charset="utf-8">
      <title>Date Form</title>
   </head>
   <body>
      <form>
         <select name="day">
            <option value='1'>1</option>
            <option value='2'>2</option>
            <option value='3'>3</option>
            <option value='4'>4</option>
            <option value='5'>5</option>
            <option value='6'>6</option>
            <option value='7'>7</option>
            <option value='8'>8</option>
            <option value='9'>9</option>
            <option value='10'>10</option>
            <option value='11'>11</option>
            <option value='12'>12</option>
            <option value='13'>13</option>
            <option value='14'>14</option>
            <option value='15'>15</option>
            <option value='16'>16</option>
            <option value='17'>17</option>
            <option value='18'>18</option>
            <option value='19'>19</option>
            <option value='20'>20</option>
            <option value='21'>21</option>
            <option value='22'>22</option>
            <option value='23'>23</option>
            <option value='24'>24</option>
            <option value='25'>25</option>
            <option value='26'>26</option>
            <option value='27'>27</option>
            <option value='28'>28</option>
            <option value='29'>29</option>
            <option value='30'>30</option>
            <option value='31'>31</option>
         </select>
         <select name="month">
            <option value='1'>January</option>
            <option value='2'>February</option>
            <option value='3'>March</option>
            <option value='4'>April</option>
            <option value='5'>May</option>
            <option value='6'>June</option>
            <option value='7'>July</option>
            <option value='8'>August</option>
            <option value='9'>September</option>
            <option value='10'>October</option>
            <option value='11'>November</option>
            <option value='12'>December</option>
         </select>
         <select name="year">
            <option value='2018'>2018</option>
            <option value='2019'>2019</option>
            <option value='2020'>2020</option>
            <option value='2021'>2021</option>
            <option value='2022'>2022</option>
            <option value='2023'>2023</option>
            <option value='2024'>2024</option>
            <option value='2025'>2025</option>
            <option value='2026'>2026</option>
            <option value='2027'>2027</option>
            <option value='2028'>2028</option>
         </select>
      </form>
   </body>
</html>

می‌بینیم که به چه سادگی توانستیم با استفاده از زبان PHP کدهای HTML را به صورت دینامیک (پویا) تولید کنیم.

online-support-icon