はじめに
PHPの試験や実務で「配列かどうか」「反復可能かどうか」を判定する場面はよくあります。is_array() と is_iterable() は似たような名前ですが、実は 判定対象の範囲がまったく異なる ので注意が必要です。
この記事では、PHP8上級試験の出題にも対応できるように、両者の違いをコードと図解で徹底解説します。
目次
🧠 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): boolPHPにおける「反復可能(iterable)」とは、
- 配列(array)
Traversableインターフェースを実装したオブジェクト
のいずれかを指します。
つまり ArrayObject や Generator なども「反復可能」とみなされます。
例:
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' | false | false | どちらも対象外 |
[1, 2] | true | true | 両方 true |
new ArrayObject() | false | true | ここで差が出る! |
✅ ポイント整理
is_array()→ 「配列型」かどうかis_iterable()→ 「foreach可能」かどうかArrayObjectのようなオブジェクトで差が出る- 試験では「両者は同じ挙動を示す」と書かれていたら誤りです!
