حلقه 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 کلیک کنید.
مثال 2 خروجیش مگه نباید بشه 2468 چرا شده 2466؟؟؟؟
این اموزش قسمت مهمی میباشد و به نظر بنده باید به متن اصلی اضافه شود
www.beyamooz.com/images/PHP/foreach_comment.pdf
[email protected]
من هم فکر میکنم خروجی باید 2468 باشه. به گفته خودتون اسم متغییر رو هم تغییر دادم و نتیجه فرق کرد ولی دلیلش رو نفهمیدم !
<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 >
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قرار بدهید. در غیر این صورت با error مواجهه خواهید شد. بنده در لوکال تست کردم با استفاده از تگ php کاملا درست عمل می کنه. در واقع این یک خطای تایپی است.
این ارور رو میده وقتی در لوکال هاست تست میکنم.
{?>
<?php}
بعنوان مثال باید به صورت های زیر عمل کنید:
{ ?>
<?php {
منبع برای اطلاعات بیشتر: stackoverflow.com/questions/11482527/parse-error-syntax-error-unexpected-end-of-file-in-my-php-code
این خروجی کد بالاست. دقیقا همونی که هست رو کپی کردم. کامنت آخر سوال منم هست.
اگه دقت کنید در سوال قبلی و خروجی اون دو عدد آخر تکراری هستند
دلیل اینکه چرا در حلقه دوم دو عدد آخر تکراری است در لینک زیر توضیح داده شده است:
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." ";
}
foreach($arr as &$value)
{
echo $value;
echo " ";
$value *= 2;
}
echo "/n";
foreach($arr as $value)
{
echo $value;
echo " ";
}
در دستور foreach اول، در ابتدای متغیر value از عملگر & استفاده شده است. بنابراین اگر در حلقه، مقدار value تغییر کند، داده اصلی نیز تغییر خواهد کرد.
توجه داشته باشید با هر بار اجرای حلقه، محتوای یک سلول از آرایه در متغیر value قرار می گیرد. و در خط 4 از کد بالا این مقدار چاپ می شود. در خط 6 محتوای value ضربدر 2 می شود و چون از علامت & در ابتدای value استفاده شده است، محتوای سلول آرایه نیز تغییر می کند. نهایتاً خروجی حلقه اول 1 2 3 4 خواهد بود. و مشخص است که عمل چاپ قبل از عملیات ضرب انجام شده است...!
اما حالا زمان اجرای حلقه دوم، دیگر تمام مقادیر آرایه ضربدر 2 شده اند و خروجی آن 2 4 6 6 خواهد بود.
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
علتش چیه؟
$value *= 10;
مقدار اصلی در آرایه نیز تغییر می کند. و نهایتاً در foreach دوم، مقادیر تغییر یافته چاپ خواهد شد.