آموزش حلقه‌ها در PHP و ترفندها

برای اجرای چندباره کدهای تکراری از حلقه‌ها در برنامه‌نویسی استفاده می‌شود. اگر بخواهید درون یک آرایه حرکت کنید یا یک جدول از اطلاعات را به کاربر نمایش دهیم، بهتر است با حلقه‌ها کار کنیم. در این آموزش با انواع حلقه در PHP آشنا شده و ترفندهای کار با آن را یاد می‌گیریم.

فرض کنید یک آرایه با تعدادی عدد درون آن داریم و می‌خواهیم مجموع آن اعداد را محاسبه کنیم. اگر تعداد عناصر مشخص باشد، شاید بتوان با نوشتن چند خط کد، تک به تک اعضا را با هم جمع نمود. اما اگر تعداد نامشخص بود چه؟

یا فرض کنید که نام تمام کاربران سایت را از پایگاه داده استخراج کرده‌ایم و می‌خواهیم آن‌ها را در یک جدول نمایش دهیم. آیا می‌توان برای تک تک کاربران، کدنویسی کرد؟

شاید اگر تعداد اعضای ما مشخص باشد، بتوانیم این کار را انجام دهیم. اما کارمان از پایه غیراصولی و اشتباه است! چرا که اگر تعداد تغییر کند یا بسیار زیاد باشد، روش قبلی جواب نخواهد داد.

به کمک حلقه‌ها در زبان‌های برنامه نویسی می‌توانیم یک قطعه کد را بارها و بارها اجرا کنیم. در حقیقت هر جایی که بخواهیم یک قطعه کد را تکرار کنیم، از حلقه‌ها (Loops) کمک می‌گیریم.

انواع حلقه در PHP

در زبان برنامه‌نویسی PHP چهار نوع حلقه داریم. کار همه حلقه‌ها تکرار یک قطعه کد است. اما برای راحتی کار و استفاده‌های خاص‌تر، چند نوع حلقه وجود دارد:

  1. حلقه for
  2. ساختار foreach
  3. حلقه while
  4. ساختار do while

حلقه for مواقعی استفاده می‌شود که تعداد چرخش (دور) حلقه برایمان مهم است. حلقه foreach مشابه for است با این تفاوت که چرخش بر روی عناصر یک آرایه خواهد بود.

چرخش در حلقه while تا زمانی ادامه پیدا می‌کند که یک شرط صحیح برقرار باشد و حلقه do while در اولین بار شرط را نادیده می‌گیرد.

در عکس زیر، یک ساختار کلی برای نحوه اجرای حلقه‌ها را می‌بینید. در ادامه استفاده از انواع حلقه PHP را با مثال یاد می‌گیریم.

دیاگرام کلی حلقه‌ها در زبان‌های برنامه‌نویسی
دیاگرام کلی حلقه‌ها در زبان‌های برنامه‌نویسی

حلقه for در PHP

از حلقه for در زبان پی‌اچ‌پی زمانی استفاده می‌شود که تعداد تکرار حلقه مشخص است. مثلاً هنگامی که می‌خواهیم قطعه کد ما به تعداد اعضای یک‌ آرایه اجرا شود یا زمانی که می‌خواهیم کدی را دقیقاً ۱۰ بار اجرا کنیم.

در هر بار تکرار حلقه for یک شرط چک شده و در صورت برقراری شرط، کد اجرا می‌شود. ساختار کلی حلقه for از چهار بخش تشکیل شده است:

  1. مقداردهی اولیه (initialization) : مقداردهی متغیرهایی که برای شرط حلقه استفاده می‌کنیم.
  2. شرط (condition) : در صورت برقرار بودن این شرط یا مجموعه شرط‌ها، قطعه کد اجرا می‌شود.
  3. عملیات افزایش (increment) : پس از هر بار اجرای حلقه، مقدار متغیرهای شرط را تغییر می‌دهد.
  4. بدنه حلقه (body) : کدهایی که در هر بار اجرای حلقه for اجرا می‌شود.

ساختار حلقه for در PHP به صورت زیر است:

for ( initialization; condition; increment ){
    // body
}

اجرای حلقه for در PHP

بیایید با یک مثال ساده شروع کنیم. فرض کنید می‌خواهیم اعداد ۱ تا ۵۰ را با هم جمع کرده و در متغیر result قرار دهیم.

برای این که متغیر $result را پس از اتمام حلقه هم داشته باشیم، باید آن را خارج از حلقه تعریف کنیم. پس ابتدا آن را تعریف کرده و مقدارش را 0 در نظر می‌گیریم.

حال نوبت حلقه for است. بخش‌های مختلف را به صورت زیر تعریف می‌کنیم:

  • مقداردهی اولیه: متغیر مربوط به اعداد ۱ تا ۵۰ که با i نام‌گذاری می‌کنیم.
  • شرط حلقه: اعداد باید بین ۱ تا ۵۰ باشند. (اگر با شرط‌ها آشنا نیستید، آموزش شرط در PHP را ببینید.)
  • عملیات افزایش: متغیر یکی یکی افزایش پیدا می‌کند.
  • بدنه: عدد با مقدار فعلی result جمع شده و در result قرار می‌گیرد.

کد حلقه for برای جمع اعداد به صورت زیر خواهد شد:

$result = 0;

for ( $i=1; $i <=50; $i++ ){
    $result = $result + $i;
}

به همین سادگی! 🙂 در قسمت عملیات افزایش، می‌توانیم هر عبارت محاسباتی دیگری نیز بنویسیم!

حلقه foreach در PHP

گفتم که حلقه foreach برای حرکت روی آرایه در PHP کاربرد دارد. عناصر آرایه می‌توانند هر چیزی باشند. فرض کنید یک آرایه شامل چند اسم داریم و می‌خواهیم آن‌ها را در یک لیست (تگ li) نمایش دهیم.

احتمالاً اولین راه‌حلی که به ذهنتان می‌رسد استفاده از حلقه for و کمک گرفتن از یک متغیر $i است که در بازه 0 تا اندازه آرایه حرکت کرده و در بدنه خود، اسامی را چاپ می‌کند.

راه‌حل شما کاملاً درست و منطقی است! اما استفاده از حلقه foreach به سادگی و خوانایی کد شما کمک زیادی می‌کند. ساختار حلقه foreach در PHP از سه بخش اصلی تشکیل شده است:

  1. آرایه (array)
  2. متغیر منتسب به هر عنصر آرایه (value)
  3. بدنه حلقه (body)
foreach ( array as value ){
   // body
}

آرایه‌ای از اسم‌های زیر را در نظر بگیرید:

$names = array( "Omid", "Nazanin", "Ehsan", "Mina" );

برای چاپ تک تک اسامی در یک لیست، به صورت زیر عمل می‌کنیم:

<?php
echo '<ul>';

foreach ( $names as $name ) {
   echo '<li>' . $name . '</li>';
}

echo '</ul>';

کاری که حلقه foreach در پی‌اچ‌پی می‌کند به این صورت است که ابتدا، اولین عنصر آرایه $names را درون متغیر $name ریخته و قطعه کد بدنه را اجرا می‌کنید.

پس از پایان اجرا، دومین عنصر آرایه را درون متغیر names ریخته و مجدداً کد را اجرا می‌کند. همین روال تا خواندن آخرین عنصر آرایه ادامه پیدا خواهد کرد. نتیجه اجرای حلقه بالا مشابه تصویر زیر خواهد شد:

خروجی نهایی حلقه foreach ساده
خروجی نهایی حلقه foreach ساده

استفاده از حلقه foreach در PHP مثل حرفه‌ای‌ها!

حالا بیایید با هم یک روش حرفه‌ای و ساده برای کار با آرایه‌های انجمنی (Associative Array) بیاموزیم! آرایه‌های انجمنی آرایه‌هایی هستند که هر عنصر آن دارای یک کلید و مقدار خاص است.

اگر بخواهیم در یک حلقه، به هر دو مقدار کلید (key) و مقدار (value) دسترسی داشته باشیم، از این روش استفاده می‌کنیم.

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

$all = array( "Elena" => 18.21,
              "Ehsan" => 15.73,
              "Mina"  => 16.37,
              "Sina"  => 17.66, );

برای نمایش نام و معدل هر نفر در یک لیست، از کد زیر استفاده می‌کنیم:

<?php
echo '<ul>';

foreach ( $all as $name => $avg ) {
   echo '<li>' . $name . ' (' .  $avg . ')</li>';
}

echo '</ul>';

در قسمت تعریف متغیر در حلقه foreach، دو متغیر با علامت ارتباط کلید و مقدار تعریف شده است. حالا در هر بار اجرای حلقه، کلید عنصر اول در $name و مقدار آن در $avg قرار می‌گیرد. این روند تا آخرین عنصر درون آرایه $all انجام شده و در نهایت خروجی ما چیزی شبیه عکس زیر خواهد بود.

خروجی استفاده حرفه‌ای از حلقه foreach در PHP
خروجی استفاده از حلقه foreach
آموزش کار با فرم در php و ساخت فرم

آموزش کار با فرم در php و ساخت فرم

حلقه while در پی اچ پی

حلقه while زمانی استفاده می‌شود که می‌خواهیم بدنه حلقه PHP تا زمانی که یک شرط برقرار است اجرا شود. مثلاً تا زمانی که عددی از 1024 کوچک‌تر است، مقدارش را دو برابر کنیم؛ یا مثلاً موقع نمایش لیست اعضای سایت، تا زمانی که هنوز کاربری باقی مانده که نمایشش ندادیم، مقدارش را چاپ کنیم.

برای مثال دوبرابر کردن عدد از قطعه کد زیر استفاده می‌کنیم:

$num = 28;
while( $num < 1024 ){
    $num = $num * 2;
}

روند اجرای حلقه while در PHP به‌صورت زیر است:

  • آیا مقدار $num از 1024 کوچک‌تر است ؟
  • اگر بله، آن را دو برابر کن و به ابتدای حلقه برگرد.
  • اگر نه، از انتهای حلقه بقیه کدها را اجرا کن.

در این مثال، پس از 5 بار تکرار حلقه، مقدار num برابر 896 خواهد شد. حلقه برای آخرین بار اجرا شده و مقدار آن برابر 1792 می‌شود. حالا دیگر شرط برقرار نیست و اجرای کد به پایان می‌رسد.

ساختار حلقه while

حلقه while در PHP دارای دو بخش است:

  1. شرط حلقه (condition)
  2. بدنه حلقه

در مثالی که گفته شد، درون شرط از یک عدد استفاده کردیم و این مقدار را درون حلقه تغییر می‌دادیم. اما بر اساس نیاز، می‌توانیم از شرط‌ها یا توابع دیگری از خارج حلقه هم کمک بگیریم.

برای مثال، فرض کنید یک تابع داریم که طبق محاسباتی، به ما اجازه دسترسی یا عدم دسترسی به بخشی از سایت را می‌دهد. تابع is_allowed() به ما true یا false برمی‌گرداند.

در جلسات بعدی آموزش PHP، تابع در PHP را یاد می‌گیریم. فعلاً بدانید وقتی از این عبارت در کدمان استفاده می‌کنیم، یک مقدار boolean به ما برگردانده می‌شود. اگر با نوع داده‌ای بولین آشنا نیستید، جلسه انواع متغیر و نوع داده در PHP برایتان مفید است.

می‌خواهیم به کمک حلقه while تا زمانی که مجوز دسترسی نداریم (خروجی false است)، منتظر بمانیم. این کار به کمک کد زیر قابل انجام است:

while( ! is_allowed() ){}

البته چون بدنه خالی است، می‌توانیم علامت {} را قرار ندهیم. برای منفی کردن نتیجه، از عملگر ! استفاده کرده‌ام.

این کد فقط مثالی بود تا متوجه شوید حتماً لازم نیست شرط حلقه از درون بدنه حلقه تغییر کند.

آموزش عملگر در PHP : یادگیری ۶ نوع اصلی عملگرهای پی اچ پی

آموزش عملگر در PHP : یادگیری ۶ نوع اصلی عملگرهای پی اچ پی

حلقه do while

در حلقه while، ابتدا شرط بررسی می‌شد و اگر شرط برقرار بود، بدنه آن اجرا می‌شد. در do-while ابتدا کد اجرا شده و سپس شرط بررسی می‌شود. اگر شرط برقرار نبود، تکرارهای بعدی انجام نخواهد شد.

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

فرض کنید می‌خواهیم عدد num را دو برابر کرده و اگر کمتر از 1024 بود، این کار را تکرار کنیم. حلقه زیر دقیقاً همین کار را انجام می‌دهد:

<?php
$num = 28;
do{
    $num = $num * 2;
}while( $num < 1024 );
آموزش رشته در PHP و ۹ تابع کاربردی کار با رشته

آموزش رشته در PHP و ۹ تابع کاربردی کار با رشته

ترفندهای کار با حلقه در PHP

در کار با حلقه‌ها در PHP می‌توان خلاقیت به خرج داد. خارج از خلاقیت‌هایی که همیشه در برنامه‌نویسی به کار می‌بریم، دو کلمه کلیدی برای عملیات‌های خاص در حلقه‌ها وجود دارند.

زبان PHP هم مانند سایر زبان‌های برنامه‌نویسی، دارای دو دستور زیر است:

  • دستور break
  • دستور continue

در کد زیر، یک حلقه for داریم که اعداد 1 تا 7 را چاپ می‌کند. با این مثال، این دو دستور را توضیح می‌دهم.

for( $i=1; $i<=7; $i++){
    echo $i . ' ';
}
// Result: 1 2 3 4 5 6 7

دستور break

فرض کنید می‌خواهیم وقتی به عدد 5 رسیدیم، اجرای حلقه به‌طور کامل متوقف شود! یعنی اعداد 5 و 6 و 7 چاپ نشوند. برای این کار از دستور break استفاده می‌کنیم:

for( $i=1; $i<=7; $i++){
   if( $i==5 ) break;
    echo $i . ' ';
}
// Result: 1 2 3 4

وقتی می‌خواهیم در حالی که شرط حلقه برقرار است، اجرا آن را متوقف کنیم، از دستور break استفاده می‌کنیم. اینطوری اجرای بقیه دورها نادیده گرفته شده و کدهای بعد از حلقه اجرا می‌شوند.

دستور continue در حلقه PHP

فرض کنید در این حلقه، می‌خواهیم از چاپ عدد 5 جلوگیری کنیم. در حالت قبلی از اجرای حلقه به‌طور کامل جلوگیری شد. اما با اجرای دستور continue فقط اجرای همان دُور از حلقه متوقف شده و به تکرار بعدی منتقل می‌شویم.

for( $i=1; $i<=7; $i++){
   if( $i==5 ) continue;
    echo $i . ' ';
}
// Result: 1 2 3 4 6 7

در قطعه کد بالا، با برقرار شدن شرط در خط دوم، اجرای آن دُور از حلقه متوقف شده و به دور $i=6 می‌رویم.

برای دیدن دیاگرام‌های دستورات break و continue می‌توانید به این منبع انگلیسی مراجعه کنید.

تبدیل انواع حلقه در PHP

پیشنهاد می‌کنم یک‌بار به ابتدای آموزش برگردید و باکس‌های کدها را تا انتها مرور کنید. به نظرتان می‌توانیم از ساختارهای حلقه به جای هم استفاده کنیم؟ یعنی کدی که با foreach نوشته‌ایم را با for پیاده‌سازی کنیم؟ یا for را به while تبدیل کنیم؟

حلقه در زبان برنامه نویسی یک مفهوم است. برای پیاده‌سازی این مفهوم در PHP از چهار ساختار مختلف می‌توانیم استفاده کنیم. در نتیجه، همه این‌ها در حقیقت یک چیز هستند اما امکانات یا ویژگی‌های خاصی در اختیارمان می‌گذارند.

در جلسه مربوط به تمرین حلقه‌ها در دوره رایگان مکمل php، دو مثال و ۲ تمرین برای یادگیری بیشتر شما زده‌ام که به بحث حلقه در PHP کاملاً مسلط شوید. 🙂

جمع‌بندی: آموزش حلقه PHP

در این آموزش با حلقه در PHP آشنا شدیم. در ابتدا انواع Loop در php و سپس ساختار و نحوه استفاده هر کدام از آن‌ها را یاد گرفتیم.

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

آیا حلقه‌ها در PHP همین مثال‌های ساده هستند؟ در جواب باید بگویم از نظر تعریف کردن، بله! به همین سادگی می‌توانیم حلقه‌ها را تعریف کنیم. ولی از نظر کاربرد، در جلسات بعدی (مثل کار با دیتابیس PHP) از این ساختار استفاده‌ی زیادی می‌کنیم.

همین الآن سعی کنید از هر حلقه یک کد نمونه (غیر از مثال‌هایی که کار کردیم) برای خودتان بنویسید. اگر سؤال یا تجربه‌ای در کار با loopها دارید، در بخش دیدگاه‌های پایین همین صفحه مطرح کنید.

این آموزش بخشی از یک آموزش جامع و قدم به قدم در سبز دانش است: دوره رایگان آموزش PHP