استفاده از دستور foreach
با استفاده از ساختار foreach می توانیم به سادگی بی اعضای یک آرایه حرکت کنیم. توجه داشته باشید که ساختار foreach فقط در مورد آرایه ها و اشیاء استفاده می شود، و اگر از این ساختار برای یک متغیر با ساختار و نوع دیگر استفاده کنید یک خطا رخ می دهد. برای استفاده از foreach دو ساختار دستوری وجود دارد:
foreach (array_expression as $value) statement foreach (array_expression as $key => $value) statement
شکل اول در داخل آرایه ای که با استفاده از array_expression مشخص شده است حرکت می کند. در هر تکرار، مقدار المان عنصر در داخل متغیر value ذخیره می شود و نشانگر داخلی آرایه برای عنصر بعدی تنظیم می گردد، یعنی در تکرار بعدی، به سراغ عنصر بعدی آرایه می رود.
شکل دوم در هر تکرار علاوه بر کارهایی که در قسمت قبلی گفته شد، کلید هر عنصر را به متغیر key نسبت می دهد.
برای اینکه بتوانید مستقیما عناصر آرایه را در داخل حلقه تغییر دهید، قبل از متغیر $value یک علامت & بگذارید. در این حالت مقدار متغیر را با مرجع نسبت می دهید.
<?php $arr = array(1, 2, 3, 4); foreach ($arr as &$value) { $value = $value * 2; } // $arr is now array(2, 4, 6, 8) unset($value); // break the reference with the last element ?>
تنها زمانی می توانید متغیر $valude را با مرجع نسبت دهید که آرایه ای که در داخل آن حرکت می کنید قابل ارجاع دادن باشد، به عبارت دیگر یک متغیر باشد. برای نمونه قطعه کد زیر اجرا نخواهد شد.
<?php foreach (array(1, 2, 3, 4) as &$value) { $value = $value * 2; } ?>
توجه داشته باشید که ارجاع به متغیر $value و آخرین عنصر آرایه حتی بعد از حلقه foreach نیز باقی می ماند. توصیه می شود که آن را با استفاده از تابع unset() از بین ببرید.
نکته: در ساختار foreach نمی توانید از عملگر @ برای نادیده گرفتن خطاها استفاده کنید.
می توانید ببینید که دو مثال زیر از نظر عملی با یکدیگر مشابه هستند:
<?php $arr = array("one", "two", "three"); reset($arr); while (list(, $value) = each($arr)) { echo "Value: $value
\n"; } foreach ($arr as $value) { echo "Value: $value
\n"; } ?>
دو مورد زیر نیز با یکدیگر مشابه هستند:
<?php $arr = array("one", "two", "three"); reset($arr); while (list($key, $value) = each($arr)) { echo "Key: $key; Value: $value
\n"; } foreach ($arr as $key => $value) { echo "Key: $key; Value: $value
\n"; } ?>
چند مثال دیگر برای آشکارتر شدن نحوه استفاده:
<?php /* foreach example 1: value only */ $a = array(1, 2, 3, 17); foreach ($a as $v) { echo "Current value of \$a: $v.\n"; } /* foreach example 2: value (with its manual access notation printed for illustration) */ $a = array(1, 2, 3, 17); $i = 0; /* for illustrative purposes only */ foreach ($a as $v) { echo "\$a[$i] => $v.\n"; $i++; } /* foreach example 3: key and value */ $a = array( "one" => 1, "two" => 2, "three" => 3, "seventeen" => 17 ); foreach ($a as $k => $v) { echo "\$a[$k] => $v.\n"; } /* foreach example 4: multi-dimensional arrays */ $a = array(); $a[0][0] = "a"; $a[0][1] = "b"; $a[1][0] = "y"; $a[1][1] = "z"; foreach ($a as $v1) { foreach ($v1 as $v2) { echo "$v2\n"; } } /* foreach example 5: dynamic arrays */ foreach (array(1, 2, 3, 4, 5) as $v) { echo "$v\n"; } ?>
پی اچ پی نسخه 5.5 یک قابلیت جدید برای برنامه نویسان ایجاد کرده است، در این نسخه و نسخه های بالاتر می توانید با استفاده از تابع list() به عنوان مقدار، در داخل عناصر آرایه آرایه ها حرکت کنید و آرایه تودرتو را به متغیرهای حلقه تبدیل کنید. به مثال زیر توجه کنید:
<?php $array = [ [1, 2], [3, 4], ]; foreach ($array as list($a, $b)) { // $a contains the first element of the nested array, // and $b contains the second element. echo "A: $a; B: $b\n"; } ?>
خروجی مثال بالا اینچنین خواهد بود:
شما می توانید در قسمت list() تعداد عناصر کمتری نسبت به آنچه در آرایه تودرتو وجود دارد را انتخاب کنید به طوری که مابقی مقادیر مربوط به آرایه (آن قسمت هایی که به آن نیزا ندارید) را نادیده بگیرید:
<?php $array = [ [1, 2], [3, 4], ]; foreach ($array as list($a)) { // Note that there is no $b here. echo "$a\n"; } ?>
خروجی مثال بالا به این شکل خواهد بود: 1 3
اگر تعداد عناصر آرایه برای پر کردن تابع list() کافی نباشند، خطایی رخ خواهد داد (در حد Notice):
<?php $array = [ [1, 2], [3, 4], ]; foreach ($array as list($a, $b, $c)) { echo "A: $a; B: $b; C: $c\n"; } ?>
خروجی قطعه کد بالا اینچنین خواهد بود:
Notice: Undefined offset: 2 in example.php on line 7 A: 1; B: 2; C: Notice: Undefined offset: 2 in example.php on line 7 A: 3; B: 4; C: