حلقه for در PHP
حلقه for در PHP
از حلقه for زمانی که تعداد دفعات اجرای دستورات را بدانید استفاده می شود یعنی دستورات داخل حلقه از یک عدد مشخص به تعدادی مشخص تکرار می شود.
نحوه استفاده:
for (init; condition; increment)
{
code to be executed;
}
پارامترها:
- init: تنها یکبار در ابتدای حلقه اجرا می شود، و اغلب برای تعریف یک شمارنده استفاده می شود.
- condition: ارزیابی تکرار حلقه، اگر شرط برقرار باشد دستورات اجرا می شوند، در غیر اینصورت دستورات ادامه نمی یابند.
- increment: بعد از هربار اجرای دستورات حلقه، این دستور اجرا می شود و اغلب برای افزایش شمارنده استفاده می شود.
نکته:
- در for می توان هرکدام از پارامترهای بالا را خالی گذاشت، به این صورت که اگر شرط خالی باشد، مقدار آن برابر با true در نظر گرفته می شود و حلقه بینهایت بار اجرا میشود! (البته با استفاده از دستور break که بعداً به آن اشاره می شود، می توان آن را قطع نمود)
- در for همچنین می توان برای پارامترهای بالا چند دستور مختلف را اجرا نمود به اینصورت که با علامت "," آنها را باید از یکدیگر جدا نمود.
مثال:
در مثال زیر یک حلقه تعریف شده که با i=1 شروع می شود، و تا زمانی که i<=5 باشد ادامه خواهد یافت و به مقدار i در هر بار اجرای حلقه یک واحد اضافه می شود.
<html>
<body>
<?php
for ($i=1; $i<=5; $i++)
{
echo "The number is " . $i . "<br />";
}
?>
</body>
</html>
خروجی کد بالا:
The number is 1
The number is 2
The number is 3
The number is 4
The number is 5
حلقه foreach درPHP
مخصوص کار با آرایه ها می باشد.
نحوه استفاده:
foreach ($array as $value)
{
code to be executed;
}
این دستور تمام مقادیر آرایه را یکی یکی از ابتدایی تا انتهایی به درون value می ریزد و دستورات را اجرا می نماید.
نکته: مقدار value کپی داده می باشد و با تغییر آن داده اصلی در آرایه تغییری نمی کند، اما با قرار دادن علامت "&" در ابتدای value یک نشانگر از آن برگردانده می شود، بدین معنا که با تغییر آن داده اصلی درون آرایه نیز تغییر می کند.
مثال1: مثال زیر یک حلقه را نشان می دهد که مقادیر گرفته شده از یک آرایه را چاپ می کند.
<html>
<body>
<?php
$x=array("one","two","three");
foreach ($x as $value)
{
echo $value . "<br />";
}
?>
</body>
</html>
خروجی کد بالا:
one
two
three
مثال2: با قرار دادن علامت "&" در ابتدای value اگر در حلقه این مقدار تغییر کند، داده اصلی نیز تغییر می کند.
<html>
<body>
<?php
$arr=array(1,2,3,4);
foreach($arr as &$value)
{
echo $value;
echo " ";
$value *= 2;
}
echo "<br />";
foreach($arr as $value)
{
echo $value;
echo " ";
}
?>
</body>
</html>
خروجی کد بالا:
1 2 3 4
2 4 6 6
مثال3: چاپ کلید و مقدار آن (key and value
)
<html>
<body>
<?php$a = array(
"one" => 1,
"two" => 2,
"three" => 3,
"seventeen" => 17
);
foreach ($a as $k => $v) {
echo "a[$k] => $v"."<br />";
}
?>
</body>
</html>
خروجی کد بالا:
a[one] => 1
a[two] => 2
a[three] => 3
a[seventeen] => 17
مثال4: چاپ کلید و مقدار آن (key and value
) در یک آرایه دو بعدی
<html>
<body>
$families = array("Ahmadi"=>array("a"=>"Ali","b"=>"Reza","c"=>"Sara"),
"Naderi"=>array("a"=>"Amir"),
"Mohamadi"=>array("a"=>"Poya","b"=>"Parniya")
);
foreach ($families as $k => $v)
foreach ($v as $b=>$v)
echo "families[$k][$b] => $v "."<br />";
</body>
</html>
خروجی کد بالا:
families[Ahmadi][a] => Ali
families[Ahmadi][b] => Reza
families[Ahmadi][c] => Sara
families[Naderi][a] => Amir
families[Mohamadi][a] => Poya
families[Mohamadi][b] => Parniya
برای مشاهده فیلم ها و آموزش های پروژه محور برنامه نویسی PHP کلیک کنید.
- نوشته شده توسط امیر پهلوان صادق
- بازدید: 32766
دیدگاهها
سلام
مثال 2 خروجیش مگه نباید بشه 2468 چرا شده 2466؟؟؟؟
روش حل این مشکل را چون طولانی شد در قالب یک فایل pdf نوشته ام
این اموزش قسمت مهمی میباشد و به نظر بنده باید به متن اصلی اضافه شود
www.beyamooz.com/images/PHP/foreach_comment.pdf
[email protected]
در مثال دوم شما باید یک val دگ تعریف کنید و توی مقدار قبلی نریزید چون از قبل مقداری داخل آن وجو داره به همین دلیل خروجی اشتباه است
به نقل از hamid fa:
من هم فکر میکنم خروجی باید 2468 باشه. به گفته خودتون اسم متغییر رو هم تغییر دادم و نتیجه فرق کرد ولی دلیلش رو نفهمیدم !
سلام به صورت زیر عمل کنید: یعنی در حلقه ی دوم متغیر value رو تغییر می دهیم، مشکل حل میشه:
<html >
<body >
<?php
$arr=array(1,2,3,4);
foreach($arr as &$value)
{
echo $value;
echo " ";
$value *= 2;
}
echo "<br / >";
foreach($arr as $value2)
{
echo $value2;
echo " ";
}
? >
</body >
</html >
با تغییر متغییر و ایجاد val2 کار بیخود انجام دادیم مث وصله زدن وقتی میتونیم با بابع unset هم کار قشنگتری انجام بدیم هم دلیل 6 بودن رو بفهمیم
php.net/manual/en/control-structures.foreach.php
سلام.
اگه بخوایم در مثال 3 مانند مثال 2 مقدار رو تغییر دهیم و بعد تغییر را نگه داذیم باید چیکار کنیم؟
به صورت زیر عمل کنید:
$a = array(
"one" => 1,
"two" => 2,
"three" => 3,
"seventeen" => 17
);
foreach ($a as $k => &$v) {
echo "a[$k] => $v"."<br />";
$v*=2;
}
سلام. در مثال 4، چرا وقتی تگ php وجود داره ارور میده؟ چرا نباید تگ php تایپ بشه؟
سلام
دقت کنید که در مثال 4 حتما باید کد های php رو داخل تگ phpقرار بدهید. در غیر این صورت با error مواجهه خواهید شد. بنده در لوکال تست کردم با استفاده از تگ php کاملا درست عمل می کنه. در واقع این یک خطای تایپی است.
البته مثال شما درسته، من آرایه ها رو اضافه و کم کرده بودم و سینتکس ارور میده. و فکر میکنم به آرایه ی درونی مربوط میشه. یعنی b$ رو نمیشناسه. k , v و b اسامی خاص هستن؟
k و v وb پارامتر هایی هستند که کلیدها(key) و مقادیر(value) در درون آنها قرار می گیرند. درواقع متغیری هستند که بعنوان پارامتر استفاده شده اند.مثلا برای آرایه ی families$ ، در حلقه ی foreach ، در هر بار اجرا کلیدها در k$ قرار می گیرند و مقادیر در v$ قرار می گیرند. چون از آرایه های تو در تو استفاده شده است، پس v$ خودش یک آرایه است. حالا در حلقه ی foreach دوم می خواهیم عناصر v$ را که یک آرایه است استخراج کنیم. دوباره از همان روش قبل استفاده می کنیم و این کلیدها و عناصر را در داخل پارامترهای b$ و v$ قرار می دهیم. و سپس آنها را چاپ می کنیم.
ممنونم از توضیحاتتون.
Parse error: syntax error, unexpected end of file, expecting variable (T_VARIABLE) or ${ (T_DOLLAR_OPEN_ CURLY_BRACES) or {$ (T_CURLY_OPEN) in C:\xampp\htdocs \w3s\37.php on line 20
این ارور رو میده وقتی در لوکال هاست تست میکنم.
این طور که نوشته شده، در خط 20 از کدهایتان مشکل وجود داره. احتمالا در این خط(در پایان کدهایتان) در بستن کد php، از یک آکولاد بلافاصله قبل از بستن تگ php استفاده کرده اید. در صورتی که باید حداقل یک فاصله بگذارید. مثلا شما باید از نمونه های زیر پرهیز کنید:
{?>
<?php}
بعنوان مثال باید به صورت های زیر عمل کنید:
{ ?>
<?php {
منبع برای اطلاعات بیشتر: stackoverflow.com/questions/11482527/parse-error-syntax-error-unexpected-end-of-file-in-my-php-code
1 2 3 4 /n2 4 6 6
این خروجی کد بالاست. دقیقا همونی که هست رو کپی کردم. کامنت آخر سوال منم هست.
اگه دقت کنید در سوال قبلی و خروجی اون دو عدد آخر تکراری هستند
بله حق با شماست، در مثال 2 از مطلب بالا، خروجی حلقه دوم اصلاح شد.
دلیل اینکه چرا در حلقه دوم دو عدد آخر تکراری است در لینک زیر توضیح داده شده است:
stackoverflow.com/questions/3307409/php-pass-by-reference-in-foreach
به نقل از امیر پهلوان صادق:
باسلام و تشکر بابت سایت فوق العاده بیاموز،
ببخشید من اون سایت رو هم خوندم اما درست متوجه نشدم. لطف می کنید مثل همیشه به زبان ساده ، علت تکرار 6 رو توضیح بدید.
ممنون.
سلام به شما دوست عزیز و گرامی چند باری این مسئله توسط من و همکاران توضیح داده شده
نگاه کنید برای اینکه دوباره چهار عدد بعدی رو در foreach چاپ کنید شما باید val دیگری رو بگیرید و نباید از val قبلی که 4 خونه قبل و 4 عدد قبلی در اون بود 4 خونه جدید رو هم در اون بریزید چون آخرین خونه که شش باشه داخل ول قبلی موجود هستش
مثل کد زیر که در حلقه foreach دومی کلا یک متغیر val دیگر تعریف شده است و دوباره عدد را داخل arr گذاشته ایم و چاپ کرده ایم
foreach ($arr as $vall)
{
echo $vall." ";
}
سلام, چرا در مثال 2 foreach اول 1 2 3 4 چاپ شدبعد 2 4 6 6 چاپ شد؟ مگه عمل *2 اول نیومده؟
سلام$arr=array(1,2,3,4);
forea ch($arr as &$value)
{
echo $value;
echo " ";
$value *= 2;
}
echo "/n";
forea ch($arr as $value)
{
echo $value;
echo " ";
}
در دستور foreach اول، در ابتدای متغیر value از عملگر & استفاده شده است. بنابراین اگر در حلقه، مقدار value تغییر کند، داده اصلی نیز تغییر خواهد کرد.
توجه داشته باشید با هر بار اجرای حلقه، محتوای یک سلول از آرایه در متغیر value قرار می گیرد. و در خط 4 از کد بالا این مقدار چاپ می شود. در خط 6 محتوای value ضربدر 2 می شود و چون از علامت & در ابتدای value استفاده شده است، محتوای سلول آرایه نیز تغییر می کند. نهایتاً خروجی حلقه اول 1 2 3 4 خواهد بود. و مشخص است که عمل چاپ قبل از عملیات ضرب انجام شده است...!
اما حالا زمان اجرای حلقه دوم، دیگر تمام مقادیر آرایه ضربدر 2 شده اند و خروجی آن 2 4 6 6 خواهد بود.
$arr3=array(1,2,3,4,6,7,8,9,10);
foreach($arr3 as &$value)
{
echo $value;
echo " ";
$value *= 10;
}
echo " ---------- ";
foreach($arr3 as $value)
{
echo $value;
echo " ";
}
وقتی کد اجرا میشه خروجی اینطوری در میاد
1 2 3 4 6 7 8 9 10 ---------- 10 20 30 40 60 70 80 90 90
علتش چیه؟
در foreach اول از علامت & استفاده شده است، بنابراین زمانی که دستور زیر در هر بار اجرای حلقه اتفاق می افتد:
$value *= 10;
مقدار اصلی در آرایه نیز تغییر می کند. و نهایتاً در foreach دوم، مقادیر تغییر یافته چاپ خواهد شد.