《PHP8上級試験対策》is_array()とis_iterable()の違いを完全理解|似ているようで全然違う!

  • URLをコピーしました!

はじめに

PHPの試験や実務で「配列かどうか」「反復可能かどうか」を判定する場面はよくあります。
is_array()is_iterable() は似たような名前ですが、実は 判定対象の範囲がまったく異なる ので注意が必要です。
この記事では、PHP8上級試験の出題にも対応できるように、両者の違いをコードと図解で徹底解説します。

キーワード: is_array / is_iterable / Traversable / ArrayObject / iterable / 配列判定 /

目次

🧠 is_array()とは

is_array() は、変数が 配列型(array) であるかどうかを判定する関数です。

is_array(mixed $value): bool
  • [] で定義された 純粋な配列 のみ true を返します。
  • ArrayObject のような 配列風オブジェクト は対象外です。

例:

is_array([1, 2]); // true
is_array(new ArrayObject()); // false

🔁 is_iterable()とは

is_iterable() は、変数が 反復可能(iterable) であるかを判定します。

is_iterable(mixed $value): bool

PHPにおける「反復可能(iterable)」とは、

  • 配列(array)
  • Traversable インターフェースを実装したオブジェクト
    のいずれかを指します。

つまり ArrayObjectGenerator なども「反復可能」とみなされます。

例:

is_iterable([1, 2]); // true
is_iterable(new ArrayObject()); // true

⚡ 実行コードで比較

<?php
declare(strict_types=1);
error_reporting(-1);

$fn = function(mixed $v){
    $type = get_debug_type($v);
    var_dump($type);
    //
    $r = is_array($v);
    var_dump($r);
    //
    $r = is_iterable($v);
    var_dump($r);
};

$fn('test');
$fn([1,2]);
$fn(new ArrayObject());

🧾 実行結果

string(6) "string"
bool(false)
bool(false)
string(5) "array"
bool(true)
bool(true)
string(11) "ArrayObject"
bool(false)
bool(true)

📊 図解:is_array vs is_iterable の関係

┌───────────────────────────────────────────┐
│         反復可能(iterable)                 │
│   ┌────────────────────────┐              │
│   │        配列(array)      │              │
│   └────────────────────────┘              │
│    ↑                        ↑             │
│ is_array() → true   is_iterable() → true  │
│ (ArrayObjectは外側のみtrue)                 │
└───────────────────────────────────────────┘

📘 図でわかるように、is_iterable() は「配列を含むより広い概念」。
つまり、「is_array() ⊂ is_iterable()」という包含関係 になります。

🧩 まとめ

is_array()is_iterable()備考
'test'falsefalseどちらも対象外
[1, 2]truetrue両方 true
new ArrayObject()falsetrueここで差が出る!

ポイント整理

  • is_array() → 「配列型」かどうか
  • is_iterable() → 「foreach可能」かどうか
  • ArrayObject のようなオブジェクトで差が出る
  • 試験では「両者は同じ挙動を示す」と書かれていたら誤りです!

この記事が気に入ったら
いいねしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次