ویژگی تصویر

متد next() در PHP

  /  PHP   /  متد next() در PHP
بنر تبلیغاتی الف
آموزش PHP

متد یا تابع next() در PHP یکی از ابزارهای ساده اما گاهی گیج‌کننده برای پیمایش آرایه‌ها و ساختارهای تکرارشونده است. در این مقاله به صورت جامع تفاوت‌ها، نمونه‌های واقعی، نکات کاربردی و خطاهای متداول مرتبط با next() را بررسی می‌کنیم — هم نسخهٔ تابعی برای آرایه‌ها و هم متد next() در رابط Iterator.

قلمروها: تابعی برای آرایه‌ها و متد در Iterator

  • تابع next(array): یک تابع سراسری (global) است که «پویشگر داخلی» (internal pointer) آرایه را یک خانه به جلو می‌برد و مقدار عنصر بعدی را باز می‌گرداند (یا false اگر عنصر بعدی وجود نداشته باشد).
  • Iterator::next(): متدی از رابط Iterator است که هنگام پیاده‌سازی کلاس‌های قابل پیمایش باید وجود داشته باشد. این متد معمولاً مقدار بازگشتی ندارد و فقط وضعیت داخلی شیء را به عنصر بعدی منتقل می‌کند.

چگونه internal pointer کار می‌کند؟

آرایه‌ها در PHP دارای یک اشاره‌گر داخلی هستند که با توابعی مانند reset(), current(), key(), next(), prev(), end() قابل کنترل است. مهم است بدانید که foreach معمولاً به اشاره‌گر داخلی آرایه وابسته نیست، بنابراین استفاده از next() و foreach کنار هم می‌تواند نتایج غیرمنتظره ایجاد کند.

نمونهٔ پایه با تابعی next()

<?php
$arr = ['a' => 10, 'b' => 20, 'c' => 30];

reset($arr);              // اشاره‌گر را به ابتدا می‌برد
echo current($arr);       // 10
next($arr);               // اشاره‌گر به 'b' می‌رود
echo current($arr);       // 20

توضیح: در مثال بالا ابتدا با reset اشاره‌گر را به اولین عنصر برگرداندیم. current مقدار عنصر فعلی را برمی‌گرداند و next اشاره‌گر را جلو می‌برد. next مقدار عنصر جدید را هم برمی‌گرداند اما اغلب برای جابجایی اشاره‌گر از آن استفاده می‌شود.

الگوی امن برای پیمایش کامل با next()

<?php
$arr = [0 => false, 1 => 1, 2 => 2]; // توجه: مقدار false در عنصر اول
reset($arr);
do {
    $key = key($arr);
    $val = current($arr);
    if ($key !== null) {
        // پردازش عنصر
        var_dump($key, $val);
    }
} while (next($arr) !== false);

توضیح: چون next() ممکن است مقدار false را نیز به عنوان مقدار واقعی عنصر بازگرداند، مقایسهٔ ساده با == false می‌تواند اشتباه ایجاد کند. بنابراین از ساختار do/while همراه با چک key() !== null یا استفاده از ملموس‌سازی دقیق (===) می‌توان به اشتباهات جلوگیری کرد.

نکات مهم و تله‌های رایج

  • next() مقداری false برمی‌گرداند اگر یا عنصر بعدی وجود نداشته باشد، یا مقدار عنصر بعدی خود false باشد — برای تشخیص باید از مقایسهٔ سخت (===) یا چک کردن key() استفاده کنید.
  • next() آرایه را به صورت مرجع می‌گیرد؛ بنابراین تغییر اشاره‌گر در توابع فرعی ممکن است اثرات جانبی داشته باشد.
  • foreach معمولاً از internal pointer استفاده نمی‌کند، لذا ترکیب foreach و توابع pointer-based باعث رفتارهای غیرمنتظره می‌شود.
  • Iterator::next() در پیاده‌سازی کلاس‌ها معمولاً مقدار بازگشتی ندارد؛ بنابراین با تابع next() اشتباه گرفته نشود.

مثال عملی: استفاده از next() برای رد کردن یک شرط

<?php
$items = [10, 0, 30, 40];
reset($items);
while (key($items) !== null) {
    $val = current($items);
    if ($val === 0) {
        // اگر صفر دیدیم، یک عنصر بعدی را پرش کن
        next($items);
        continue;
    }
    echo $val . PHP_EOL;
    next($items);
}

توضیح: در این چرخه ما با key() !== null پایان آرایه را چک می‌کنیم و هنگام مواجهه با مقدار 0، یک بار next() اضافی می‌زنیم تا عنصر بعدی را پرش کنیم. این الگو برای شرایطی که می‌خواهید پویا عناصر را نادیده بگیرید مفید است.

متد next() در پیاده‌سازی Iterator

<?php
class MyIterator implements Iterator {
    private $pos = 0;
    private $data = [10, 20, 30];

    public function current() { return $this->data[$this->pos]; }
    public function key()     { return $this->pos; }
    public function next()    { $this->pos++; } // بازگردانده ندارد
    public function rewind()  { $this->pos = 0; }
    public function valid()   { return isset($this->data[$this->pos]); }
}

$it = new MyIterator();
foreach ($it as $k => $v) {
    echo "$k => $vn";
}

توضیح: در اینجا next() متدی است که وضعیت داخلی شیء را به عنصر بعدی منتقل می‌کند و مقدار بازگشتی ندارد. هنگام استفاده از foreach روی شیء Iterator، PHP به روش خاصی متدهای rewind(), valid(), current(), key(), next() را صدا می‌زند. برخلاف تابع next() روی آرایه، این متد فقط وظیفه تغییر وضعیت داخلی را دارد.

مقایسهٔ خلاصه (جدول)

ویژگیتابع next(array)Iterator::next()
محل تعریفتابع سراسری PHPمتد در کلاس‌هایی که Iterator پیاده‌سازی می‌کنند
مقدار بازگشتیمقدار عنصر بعدی یا falseمعمولاً void (بدون مقدار بازگشتی)
مخاطرهٔ مقایسهمقدار false واقعی با پایان اشتباه گرفته می‌شودنادیده

بهینه‌سازی و بهترین شیوه‌ها

  • اگر فقط پیمایش ساده می‌خواهید، از foreach استفاده کنید — امن‌تر و خواناتر است.
  • برای منطق پیچیده که نیاز به پرش یا بازخوانی اشاره‌گر دارد، از توابع pointer-based (reset/current/next/key) استفاده کنید، اما با دقت در مقایسه‌ها.
  • هنگام استفاده با آرایه‌هایی که ممکن است مقدار false داشته باشند، از key() برای تشخیص پایان آرایه استفاده کنید یا از مقایسهٔ سخت (===) بهره ببرید.
  • برای کلاس‌های سفارشی که نیاز به پیمایش دارند، Iterator را پیاده‌سازی کنید و از متد next() داخلی کلاس بهره ببرید.

خلاصه

تابع next() در PHP ابزاری ساده و قدرتمند برای کنترل دستی اشاره‌گر داخلی آرایه است، اما باید از تفاوت آن با متد Iterator::next() و نیز تلهٔ مقدار false آگاه باشید. در بیشتر موارد foreach پاسخگو و ایمن است؛ اما وقتی نیاز به کنترل دقیق‌تر دارید، یادگیری درست reset/current/next/key به‌خصوص در موقعیت‌های پردازش پیچیده ضروری است.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: