در برنامهنویسی بسیاری از مواقع لازم است یک عملیات را چندین بار تکرار کنیم.
برای مثال تصور کنید در یک فروشگاه اینترنتی میخواهیم:
- نام ۱۰۰ محصول را نمایش دهیم.
- روی تمام کاربران یک عملیات انجام دهیم.
- اطلاعات تمام سفارشهای یک مشتری را پردازش کنیم.
- اعداد ۱ تا ۱۰۰ را چاپ کنیم.
- تمام عناصر یک Array را بررسی کنیم.
- روی لیستی از محصولات یک تخفیف مشخص اعمال کنیم.
نوشتن یک دستور جداگانه برای هر مورد منطقی نیست. اینجاست که حلقهها یا Loops در PHP وارد میشوند.
حلقه به ما اجازه میدهد یک بخش از کد را تا زمانی که یک شرط برقرار است یا تا زمانی که تمام دادههای موردنظر پیمایش شوند، چندین بار اجرا کنیم.
در PHP چند نوع حلقه اصلی وجود دارد:
forwhiledo...whileforeach
همچنین ابزارهایی مانند break و continue به ما اجازه میدهند نحوه اجرای حلقه را کنترل کنیم.
در این آموزش تمام این ساختارها را با مثالهای ساده و کاربردی بررسی میکنیم.
# حلقه در PHP چیست؟
حلقه یا Loop ساختاری در برنامهنویسی است که اجازه میدهد یک قطعه کد چندین بار اجرا شود.
مثلاً اگر بخواهیم اعداد ۱ تا ۵ را نمایش دهیم، میتوانیم بنویسیم:
for ($i = 1; $i <= 5; $i++) {
echo $i;
}
خروجی:
1
2
3
4
5
به جای اینکه پنج بار echo بنویسیم، یک حلقه ایجاد کردهایم که عملیات موردنظر را پنج بار انجام میدهد.
# انواع حلقه در PHP
چهار حلقه اصلی PHP عبارتاند از:
| حلقه | کاربرد |
|---|---|
for | زمانی که تعداد تکرار مشخص یا قابل محاسبه است |
while | زمانی که تکرار بر اساس یک شرط ادامه پیدا میکند |
do...while | زمانی که میخواهیم کد حداقل یک بار اجرا شود |
foreach | پیمایش Array و دادههای قابل پیمایش |
در ادامه هرکدام را بررسی میکنیم.
# حلقه for در PHP
حلقه for یکی از رایجترین حلقهها در PHP است.
ساختار کلی آن:
for (initialization; condition; increment) {
// code
}
مثلاً:
for ($i = 1; $i <= 5; $i++) {
echo $i;
}
در این مثال سه بخش اصلی داریم:
$i = 1
مقدار اولیه را مشخص میکند.
$i <= 5
شرط ادامه اجرای حلقه است.
و:
$i++
بعد از هر بار اجرای حلقه مقدار $i را افزایش میدهد.
# اجرای مرحلهبهمرحله حلقه for
کد زیر را در نظر بگیرید:
for ($i = 1; $i <= 3; $i++) {
echo $i;
}
اجرای حلقه تقریباً به این صورت است:
$i = 1
↓
1 <= 3 → true
↓
echo 1
↓
$i++
↓
$i = 2
↓
2 <= 3 → true
↓
echo 2
↓
$i++
↓
$i = 3
↓
3 <= 3 → true
↓
echo 3
↓
$i++
↓
$i = 4
↓
4 <= 3 → false
↓
پایان حلقه
درک این فرآیند برای یادگیری Loopها بسیار مهم است.
# شمارش معکوس با for در PHP
میتوان حلقه را از عدد بزرگتر به عدد کوچکتر اجرا کرد:
for ($i = 10; $i >= 1; $i--) {
echo $i;
}
خروجی:
10
9
8
7
6
5
4
3
2
1
# افزایش مقدار با گام مشخص
لازم نیست مقدار متغیر در هر مرحله فقط یک واحد افزایش پیدا کند.
مثلاً:
for ($i = 0; $i <= 20; $i += 5) {
echo $i;
}
خروجی:
0
5
10
15
20
# حلقه for و Array
اگرچه برای پیمایش Array معمولاً foreach انتخاب مناسبتری است، اما میتوان با for نیز این کار را انجام داد.
مثلاً:
$colors = ["red", "green", "blue"];
for ($i = 0; $i < count($colors); $i++) {
echo $colors[$i];
}
در این مثال count() تعداد عناصر Array را مشخص میکند.
# حلقه while در PHP
حلقه while تا زمانی اجرا میشود که شرط آن true باشد.
ساختار:
while (condition) {
// code
}
مثلاً:
$i = 1;
while ($i <= 5) {
echo $i;
$i++;
}
خروجی:
1
2
3
4
5
# تفاوت for و while در PHP
بهصورت کلی:
for زمانی مناسب است که ساختار شمارش یا تعداد تکرار مشخص باشد.
مثلاً:
for ($i = 1; $i <= 100; $i++) {
// ...
}
اما while زمانی میتواند مناسب باشد که ادامه عملیات بیشتر به یک وضعیت یا شرط وابسته باشد:
while ($condition) {
// ...
}
البته این یک قانون مطلق نیست و هر دو حلقه در سناریوهای مختلف قابل استفاده هستند.
# مثال کاربردی while
فرض کنید میخواهیم تا زمانی که موجودی محصول بیشتر از صفر است، عملیات خاصی انجام دهیم:
$stock = 5;
while ($stock > 0) {
echo "یک محصول پردازش شد.";
$stock--;
}
با هر بار اجرای حلقه، موجودی یک واحد کاهش پیدا میکند.
# اهمیت تغییر شرط در while
یکی از اشتباهات رایج هنگام استفاده از while این است که وضعیت مورد استفاده در شرط هیچگاه تغییر نکند.
مثلاً:
$i = 1;
while ($i <= 5) {
echo $i;
}
این کد مشکل دارد؛ زیرا مقدار $i هیچگاه تغییر نمیکند.
در نتیجه شرط همیشه برقرار باقی میماند و حلقه میتواند به شکل نامحدود ادامه پیدا کند.
نسخه صحیح:
$i = 1;
while ($i <= 5) {
echo $i;
$i++;
}
بنابراین هنگام استفاده از while همیشه باید مشخص باشد که چه چیزی باعث پایان یافتن حلقه خواهد شد.
# حلقه do while در PHP
حلقه do...while شبیه while است، اما یک تفاوت مهم دارد:
کد داخل آن حداقل یک بار اجرا میشود.
ساختار:
do {
// code
} while (condition);
مثلاً:
$i = 1;
do {
echo $i;
$i++;
} while ($i <= 5);
خروجی:
1
2
3
4
5
# تفاوت while و do while
در while ابتدا شرط بررسی میشود و سپس کد اجرا میشود.
اما در do...while ابتدا کد اجرا شده و بعد شرط بررسی میشود.
مثلاً:
$i = 10;
while ($i < 5) {
echo $i;
}
هیچ خروجی نخواهیم داشت.
اما:
$i = 10;
do {
echo $i;
} while ($i < 5);
مقدار 10 حداقل یک بار نمایش داده میشود.
بنابراین:
while
↓
شرط
↓
اجرا
ولی:
do...while
↓
اجرا
↓
شرط
# foreach در PHP چیست؟
foreach یکی از مهمترین حلقههای PHP برای کار با Arrayها و دادههای قابل پیمایش است.
مثلاً:
$colors = ["red", "green", "blue"];
foreach ($colors as $color) {
echo $color;
}
خروجی:
red
green
blue
برای پیمایش Array، foreach معمولاً خواناتر و مناسبتر از استفاده دستی از Indexهاست.
# ساختار foreach در PHP
ساختار ساده:
foreach ($array as $value) {
// code
}
مثلاً:
$users = ["Ali", "Sara", "Reza"];
foreach ($users as $user) {
echo $user;
}
در هر بار اجرای حلقه، مقدار عنصر بعدی داخل $user قرار میگیرد.
# دریافت Key و Value در foreach
برای Associative Array میتوان هم Key و هم Value را دریافت کرد:
$user = [
"name" => "Ali",
"age" => 25,
"city" => "Tehran"
];
foreach ($user as $key => $value) {
echo $key . ": " . $value;
}
خروجی:
name: Ali
age: 25
city: Tehran
این روش برای پردازش دادههای ساختاریافته بسیار کاربردی است.
# foreach روی آرایه چندبعدی
یکی از کاربردهای مهم foreach پیمایش Arrayهای چندبعدی است.
مثلاً:
$users = [
[
"name" => "Ali",
"age" => 25
],
[
"name" => "Sara",
"age" => 30
]
];
foreach ($users as $user) {
echo $user["name"];
}
در این مثال هر $user خودش یک Array است.
# foreach و شرط if
میتوان داخل Loop از شرطها استفاده کرد.
مثلاً:
$users = [
["name" => "Ali", "active" => true],
["name" => "Sara", "active" => false],
["name" => "Reza", "active" => true]
];
foreach ($users as $user) {
if ($user["active"]) {
echo $user["name"] . " فعال است.";
}
}
این الگو در پروژههای واقعی بسیار رایج است.
# تغییر مقدار عناصر Array با foreach
اگر بخواهیم مقدار عناصر یک Array را مستقیماً تغییر دهیم، میتوانیم از Reference استفاده کنیم.
مثلاً:
$numbers = [1, 2, 3];
foreach ($numbers as &$number) {
$number *= 2;
}
unset($number);
بعد از اجرای کد، Array شامل:
[2, 4, 6]
خواهد بود.
استفاده از Reference باید با دقت انجام شود؛ به همین دلیل بعد از اتمام حلقه بهتر است Reference را با unset() آزاد کنیم.
# break در PHP چیست؟
break برای متوقف کردن اجرای Loop استفاده میشود.
مثلاً:
for ($i = 1; $i <= 10; $i++) {
if ($i === 5) {
break;
}
echo $i;
}
خروجی:
1
2
3
4
وقتی $i به ۵ برسد، break اجرا شده و حلقه متوقف میشود.
# مثال کاربردی break
فرض کنید میخواهیم در میان لیست کاربران، اولین کاربر Administrator را پیدا کنیم:
$users = [
["name" => "Ali", "role" => "user"],
["name" => "Sara", "role" => "admin"],
["name" => "Reza", "role" => "admin"]
];
foreach ($users as $user) {
if ($user["role"] === "admin") {
echo $user["name"];
break;
}
}
پس از پیدا کردن اولین Administrator، دیگر نیازی به ادامه پیمایش نداریم.
# continue در PHP چیست؟
continue باعث میشود اجرای فعلی حلقه متوقف شود و برنامه به Iteration بعدی برود.
مثلاً:
for ($i = 1; $i <= 5; $i++) {
if ($i === 3) {
continue;
}
echo $i;
}
خروجی:
1
2
4
5
در این مثال وقتی $i برابر ۳ است، آن Iteration نادیده گرفته میشود.
# تفاوت break و continue
تفاوت این دو بسیار مهم است:
break
کل Loop را متوقف میکند.
Loop
↓
break
↓
پایان Loop
continue
فقط Iteration فعلی را متوقف میکند و به مرحله بعد میرود.
Loop
↓
continue
↓
Iteration بعدی
# حلقههای تو در تو در PHP
گاهی یک Loop داخل Loop دیگری قرار میگیرد.
به این ساختار Nested Loop گفته میشود.
مثلاً:
for ($i = 1; $i <= 3; $i++) {
for ($j = 1; $j <= 3; $j++) {
echo $i . "-" . $j;
}
}
در این حالت حلقه داخلی برای هر بار اجرای حلقه خارجی اجرا میشود.
# مثال کاربردی حلقه تو در تو
فرض کنید میخواهیم یک جدول ضرب ساده ایجاد کنیم:
for ($i = 1; $i <= 5; $i++) {
for ($j = 1; $j <= 5; $j++) {
echo ($i * $j) . " ";
}
echo "<br>";
}
این روش در تولید دادههای دوبعدی و پردازش ساختارهای تو در تو کاربرد دارد.
# حلقه بینهایت در PHP
اگر شرط Loop همیشه true باشد، حلقه میتواند بدون پایان ادامه پیدا کند.
مثلاً:
while (true) {
echo "Running...";
}
این نوع حلقه باید با احتیاط استفاده شود.
در برخی سناریوهای خاص، حلقههای دائمی در Workerها و پردازشهای پسزمینه استفاده میشوند؛ اما در یک درخواست معمولی Web، حلقه بینهایت میتواند باعث مصرف شدید منابع یا Timeout شود.
# خروج از حلقههای تو در تو
در صورت نیاز میتوان با break از چند سطح Loop خارج شد.
مثلاً:
for ($i = 1; $i <= 5; $i++) {
for ($j = 1; $j <= 5; $j++) {
if ($i === 3 && $j === 3) {
break 2;
}
echo "$i-$j";
}
}
در اینجا:
break 2;
باعث خروج از دو سطح Loop میشود.
# استفاده از foreach برای محصولات فروشگاه
یک مثال نزدیک به پروژههای واقعی:
$products = [
[
"name" => "Laptop",
"price" => 50000000
],
[
"name" => "Mouse",
"price" => 1000000
],
[
"name" => "Keyboard",
"price" => 2000000
]
];
foreach ($products as $product) {
echo $product["name"];
echo " - ";
echo $product["price"];
}
در پروژههای واقعی، چنین دادههایی ممکن است از Database یا API دریافت شوند.
# استفاده از حلقه برای محاسبه مجموع
مثلاً:
$prices = [100, 200, 300, 400];
$total = 0;
foreach ($prices as $price) {
$total += $price;
}
echo $total;
نتیجه:
1000
این الگو پایه بسیاری از محاسبات در سیستمهای فروش است.
# استفاده از حلقه برای پیدا کردن یک مقدار
مثلاً:
$numbers = [10, 20, 30, 40, 50];
foreach ($numbers as $number) {
if ($number === 30) {
echo "عدد پیدا شد.";
break;
}
}
وقتی مقدار موردنظر پیدا شود، با break اجرای Loop را متوقف میکنیم.
# چه زمانی از for استفاده کنیم؟
for انتخاب مناسبی است زمانی که:
- تعداد تکرار مشخص است.
- با یک Counter کار میکنیم.
- میخواهیم از یک عدد به عدد دیگر حرکت کنیم.
- به Index آرایه نیاز داریم.
مثلاً:
for ($i = 0; $i < 10; $i++) {
echo $i;
}
# چه زمانی از while استفاده کنیم؟
while زمانی مناسب است که ادامه Loop بیشتر به یک شرط وابسته باشد.
مثلاً:
while ($connectionIsActive) {
// process
}
یا:
while ($stock > 0) {
// process
$stock--;
}
# چه زمانی از do while استفاده کنیم؟
زمانی که میخواهیم عملیات حداقل یک بار انجام شود.
مثلاً در برخی فرآیندهای تعاملی یا زمانی که اولین اجرای عملیات مستقل از نتیجه شرط است.
# چه زمانی از foreach استفاده کنیم؟
برای پیمایش Arrayها و دادههای قابل پیمایش، foreach معمولاً انتخاب بسیار مناسبی است.
مثلاً:
foreach ($users as $user) {
echo $user["name"];
}
این ساختار خواناتر از مدیریت دستی Indexها در بسیاری از سناریوهاست.
# اشتباهات رایج هنگام استفاده از حلقهها در PHP
1. ایجاد حلقه بینهایت
مثلاً:
$i = 0;
while ($i < 10) {
echo $i;
}
در اینجا $i هیچگاه تغییر نمیکند.
2. شرط اشتباه در for
مثلاً:
for ($i = 0; $i > 10; $i++) {
echo $i;
}
شرط از همان ابتدا False است و حلقه اجرا نمیشود.
3. استفاده بیش از حد از حلقههای تو در تو
Nested Loopها اگر بیش از حد استفاده شوند، میتوانند باعث پیچیدگی و کاهش Performance شوند.
4. پردازش حجم بسیار زیاد داده در یک Loop
اگر داده بسیار زیادی داشته باشیم، اجرای همه پردازشها در یک Request میتواند باعث مصرف بالای CPU، RAM یا رسیدن به Timeout شود.
در چنین شرایطی ممکن است نیاز به Pagination، Chunking، Queue یا پردازش Background داشته باشیم.
# عملکرد حلقهها و Performance
خود Loopها ذاتاً مشکل Performance نیستند.
مشکل زمانی ایجاد میشود که:
- حجم داده بسیار زیاد باشد.
- Loopهای تو در تو داشته باشیم.
- داخل Loop Query Database اجرا کنیم.
- داخل Loop درخواست HTTP ارسال کنیم.
- عملیات سنگین CPU انجام دهیم.
برای مثال این الگو میتواند در پروژههای واقعی مشکلساز شود:
foreach ($users as $user) {
$orders = getOrdersFromDatabase($user["id"]);
}
اگر ۱۰٬۰۰۰ کاربر داشته باشیم، ممکن است هزاران Query اجرا شود.
در چنین شرایطی باید معماری و نحوه دریافت داده را اصلاح کنیم.
# یک نکته مهم درباره Query داخل Loop
یکی از مشکلات رایج در برنامههای PHP و Frameworkهایی مانند Laravel این است که برنامهنویس داخل یک Loop برای هر Record یک Query جداگانه اجرا میکند.
این مسئله میتواند به مشکل معروف N+1 Query منجر شود.
مثلاً:
foreach ($users as $user) {
// query database
}
در پروژههای Laravel معمولاً میتوان با استفاده صحیح از Relationshipها و Eager Loading این مشکل را کاهش داد.
بنابراین یادگیری Loop فقط به Syntax محدود نمیشود و باید به تأثیر آن بر Performance برنامه نیز توجه کنید.
# جمعبندی
حلقهها در PHP یکی از مهمترین ابزارهای برنامهنویسی هستند و برای اجرای تکراری یک بخش از کد استفاده میشوند.
چهار ساختار اصلی Loop در PHP عبارتاند از:
for
while
do...while
foreach
همچنین دو دستور بسیار مهم برای کنترل حلقهها داریم:
break
continue
بهصورت خلاصه:
forبرای تکرارهای شمارشی بسیار مناسب است.whileتا زمانی که شرط برقرار باشد اجرا میشود.do...whileحداقل یک بار اجرا میشود.foreachبرای پیمایش Arrayها بسیار کاربردی است.breakکل حلقه را متوقف میکند.continueIteration فعلی را رد میکند.
اگر در حال یادگیری PHP هستید، بعد از یادگیری شرطها و حلقهها، پیشنهاد میشود سراغ توابع در PHP بروید. Functionها به شما کمک میکنند کدهای تکراری را در قالب واحدهای قابل استفاده مجدد سازماندهی کنید.
# سوالات متداول درباره حلقهها در PHP
حلقه در PHP چیست؟
حلقه ساختاری است که به برنامه اجازه میدهد یک بخش از کد را چندین بار اجرا کند.
چند نوع حلقه در PHP وجود دارد؟
چهار حلقه اصلی در PHP شامل for، while، do...while و foreach هستند.
بهترین حلقه برای Array در PHP چیست؟
در بیشتر موارد foreach برای پیمایش Array انتخاب ساده و خوانایی است.
تفاوت for و while در PHP چیست؟
for معمولاً برای حلقههای شمارشی و زمانی که ساختار مقداردهی، شرط و تغییر Counter مشخص است مناسب است؛ while بیشتر برای شرایطی کاربرد دارد که ادامه اجرای Loop به یک وضعیت وابسته است.
تفاوت while و do while چیست؟
در while ابتدا شرط بررسی میشود، اما در do...while ابتدا کد اجرا میشود و سپس شرط بررسی خواهد شد. بنابراین do...while حداقل یک بار اجرا میشود.
break در PHP چیست؟
break برای خروج از حلقه استفاده میشود.
continue در PHP چیست؟
continue اجرای Iteration فعلی را متوقف کرده و اجرای حلقه را از Iteration بعدی ادامه میدهد.
آیا حلقه بینهایت در PHP خطرناک است؟
در یک Web Request معمولی، حلقه بینهایت میتواند باعث مصرف منابع و Timeout شود و باید از آن جلوگیری کرد، مگر در سناریوهای خاصی که چرخه پردازش دائمی عمداً طراحی شده باشد.
آیا میتوان یک حلقه را داخل حلقه دیگر قرار داد؟
بله. به این ساختار Nested Loop گفته میشود؛ اما استفاده بیش از حد از حلقههای تو در تو میتواند پیچیدگی و هزینه پردازشی را افزایش دهد.
# مقالات مرتبط
برای ادامه یادگیری PHP، مقالات زیر را نیز مطالعه کنید:
- PHP چیست و چه کاربردی دارد؟
- آموزش PHP از صفر
- ساختار Syntax در PHP
- متغیرها در PHP
- انواع داده در PHP
- شرطها در PHP
- توابع در PHP
- آرایهها در PHP
- رشتهها در PHP
- کار با تاریخ و زمان در PHP
- کار با JSON در PHP
- کار با فایل در PHP
- Exception در PHP
- Namespace در PHP
- Composer چیست؟
- OOP در PHP
# مسیر پیشنهادی یادگیری PHP
PHP چیست؟
↓
آموزش PHP از صفر
↓
Syntax در PHP
↓
متغیرها در PHP
↓
انواع داده در PHP
↓
شرطها در PHP
↓
حلقهها در PHP
↓
توابع در PHP
↓
آرایهها در PHP
↓
رشتهها در PHP
↓
تاریخ و زمان در PHP
↓
JSON در PHP
↓
کار با فایل
↓
Exception
↓
Namespace
↓
Composer
↓
OOP





