ویژگی تصویر

تابع is_array() در PHP

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

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

قالب و مقدار بازگشتی

تابع is_array یک پارامتر می‌پذیرد و مقدار بولی بازمی‌گرداند:

bool is_array ( mixed $var )

اگر $var یک آرایهٔ PHP باشد، مقدار true و در غیر این صورت false بازگردانده می‌شود.

مثال ساده

<?php
$a = [1, 2, 3];
$b = "not an array";
$c = new ArrayObject([4, 5]);

var_dump(is_array($a)); // true
var_dump(is_array($b)); // false
var_dump(is_array($c)); // false
?>

در این مثال is_array فقط برای $a که از نوع آرایهٔ داخلی PHP است مقدار true برمی‌گرداند. توجه کنید که شیء ArrayObject از SPL گرچه شبیه آرایه رفتار می‌کند اما is_array برای آن false برمی‌گرداند.

استفادهٔ رایج در شرط‌ها و حلقه‌ها

<?php
function printList($items) {
    if (!is_array($items)) {
        echo "پیش‌بینی می‌شد یک آرایه باشد.";
        return;
    }

    foreach ($items as $item) {
        echo $item . PHP_EOL;
    }
}

printList(["a", "b", "c"]);
printList("not array");
?>

این الگو (چک کردن is_array پیش از foreach) رایج و ایمن است تا از خطاهای زمان اجرا جلوگیری شود. اگر ورودی آرایه نبود، تابع پیام مناسبی می‌دهد و از اجرای foreach جلوگیری می‌شود.

پیمایش بازگشتی آرایه‌های تو در تو

<?php
function flattenArray(array $arr) : array {
    $out = [];
    foreach ($arr as $value) {
        if (is_array($value)) {
            $out = array_merge($out, flattenArray($value));
        } else {
            $out[] = $value;
        }
    }
    return $out;
}

$nested = [1, [2, 3], [[4], 5]];
$result = flattenArray($nested);
print_r($result); // [1,2,3,4,5]
?>

در این مثال از is_array برای تشخیص عناصر آرایه‌ای درون آرایهٔ ورودی استفاده شده و آرایهٔ تو در تو باز شده و مسطح می‌شود. تابع type hinting (array) در امضای تابع به توسعه‌دهنده کمک می‌کند اما is_array داخل تابع هم در حالت‌های داینامیک مفید است.

مقایسه با توابع مرتبط

تابعبرای چه چیزی true می‌شودیادداشت
is_array()فقط آرایه‌های داخلی PHPآرایه‌های ساخته‌شده با [] یا array()
is_iterable()آرایه‌ها و اشیاء Traversableاز PHP 7.1، مناسب برای foreach عمومی
instanceof Traversableاشیاء قابل پیمایشبرای بررسی اشیاءی که تکرارشونده هستند
is_object()هر شیءتشخیص اینکه متغیر شیء هست یا خیر

نکتهٔ کلیدی: is_array فقط آرایه‌های واقعی PHP را شناسایی می‌کند؛ اگر می‌خواهید هر ساختار قابل پیمایش (مثل Generator، ArrayObject یا کلاس‌هایی که Traversable پیاده‌سازی کرده‌اند) را نیز قبول کنید، is_iterable یا instanceof Traversable مناسب‌تر است.

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

  • اگر قصد دارید هم آرایه‌ها و هم اشیاء قابل پیمایش را بپذیرید، به جای is_array از is_iterable استفاده کنید.
  • برای بررسی دقیق‌تر نوع، از type hints و declare(strict_types=1) در فایل‌ها استفاده کنید.
  • دقت کنید is_array برای ArrayObject یا اشیاء پیاده‌سازی‌شدهٔ ArrayAccess یا Traversable مقدار false برمی‌گرداند.
  • برای پردازش حجیم آرایه‌ها، از بازگشتی‌های بهینه یا عملیات مبتنی بر Iterator استفاده کنید تا مصرف حافظه کمتر شود.

نمونهٔ جایگزین با is_iterable (بهینه‌تر برای ورودی‌های متنوع)

<?php
function iterateItems($items) {
    if (!is_iterable($items)) {
        throw new InvalidArgumentException("items must be iterable");
    }

    foreach ($items as $k => $v) {
        echo "$k : $vn";
    }
}

// می‌پذیرد: آرایه، ArrayObject، Generator ...
iterateItems([1,2,3]);
?>

در این نسخه با is_iterable هم آرایه‌ها و هم اشیاء قابل پیمایش پذیرفته می‌شوند. این روش در کدهایی که لازم است انعطاف‌پذیری بیشتر داشته باشند، مناسب است.

کاربرد عملی: بررسی خروجی json_decode

<?php
$json = '{"a":1,"b":[2,3]}';
$data = json_decode($json, true); // اگر true باشد => آرایه
if (is_array($data)) {
    // پردازش به عنوان آرایه
    print_r($data);
} else {
    // رفتار برای اشیاء یا خطا
    var_dump($data);
}
?>

تابع json_decode با پارامتر دوم true خروجی را به آرایهٔ associative تبدیل می‌کند؛ با is_array می‌توان به سرعت تشخیص داد که نتیجه قابل دسترسی به‌صورت آرایه هست یا نه و بر اساس آن منطق متفاوت اجرا کرد.

موارد هشدار و نکات مهم

  • is_array برای تشخیص «آرایه‌نماها» (مثل اشیاء) مناسب نیست؛ اگر به چنین سازگاری نیاز دارید از is_iterable یا instanceof استفاده کنید.
  • در صورت استفاده از کلاس‌های دلخواهی که رفتار آرایه‌ای دارند، بررسی کنید آیا باید instanceof ArrayAccess یا Traversable را بررسی کنید یا از adapter استفاده نمایید.
  • اگر نوع پارامتر را در امضای تابع مشخص کرده‌اید (type hint)، نیاز به چک‌های اضافی کمتر می‌شود، اما در ورودی‌های خارجی (مثل API یا داده‌های کاربر) همیشه اعتبارسنجی لازم است.

خلاصه و جمع‌بندی

تابع is_array() تابعی ساده اما کاربردی برای بررسی اینکه آیا یک متغیر آرایهٔ داخلی PHP است یا خیر محسوب می‌شود. در سناریوهای ساده و دفاعی برای پیشگیری از خطاهای foreach یا عملیات مختص آرایه بسیار مفید است. برای کدهای انعطاف‌پذیرتر که باید اشیاء Traversable را بپذیرند، is_iterable گزینهٔ مناسب‌تری است. رعایت بهترین شیوه‌ها—مثل استفاده از type hints، بررسی ورودی‌های خارجی و انتخاب درست بین is_array و is_iterable—باعث می‌شود کد شما هم پایدارتر و هم خواناتر باشد.

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

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