طراحی وب سایت کتابخانه

طراحی وب سایت کتابخانه

استفاده از دستور foreach

سه شنبه, ۱۲ خرداد ۱۳۹۴، ۰۱:۰۶ ب.ظ

     با استفاده از ساختار foreach می توانیم به سادگی بی اعضای یک آرایه حرکت کنیم. توجه داشته باشید که ساختار foreach فقط در مورد آرایه ها و اشیاء استفاده می شود، و اگر از این ساختار برای یک متغیر با ساختار و نوع دیگر استفاده کنید یک خطا رخ می دهد. برای استفاده از foreach دو ساختار دستوری وجود دارد:

foreach (array_expression as $value)
    statement
foreach (array_expression as $key => $value)
    statement

     شکل اول در داخل آرایه ای که با استفاده از array_expression مشخص شده است حرکت می کند. در هر تکرار، مقدار المان عنصر در داخل متغیر value ذخیره می شود و نشانگر داخلی آرایه برای عنصر بعدی تنظیم می گردد، یعنی در تکرار بعدی، به سراغ عنصر بعدی آرایه می رود.
     شکل دوم در هر تکرار علاوه بر کارهایی که در قسمت قبلی گفته شد، کلید هر عنصر را به متغیر key نسبت می دهد.

     توجه داشته باشید هنگامی که ساختار foreach در ابتدا شروع به کار می کند، نشانگر داخلی آرایه به صورت خودکار مجددا تنظیم می شود و به عنصر اول آرایه اشاره می کند. این مساله یعنی اینکه شما قبل از استفاده از foreach مجبور نیستید از تابع reset() استفاده کنید. از آنجا که ساختار foreach به نشانگر داخلی آرایه وابسته است، تغییر دادن این نشانگر در داخل چرخه می تواند به رفتارهای غیر قابل پیش بینی منجر شود.

     برای اینکه بتوانید مستقیما عناصر آرایه را در داخل حلقه تغییر دهید، قبل از متغیر $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";
}
?>
بازکردن آرایه های تودرتو با استفاده از list()

     پی اچ پی نسخه 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: 
موافقین ۱ مخالفین ۰ ۹۴/۰۳/۱۲
مهرداد یوسفی فرد

نظرات (۰)

هیچ نظری هنوز ثبت نشده است

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی