PHPのforeach文で「Warning: Invalid argument supplied for foreach()」の警告文を回避する

スポンサーリンク
スポンサーリンク
ライフスタイル関連のコンテンツ
お金 | 仕事 | 勉強 | プライベート | 健康 |
プログラミング関連のコンテンツ
C言語/C++入門 | Ruby入門 | Python入門 | プログラミング全般

APIを利用する場合、XMLレスポンスとして返ってくるのは、多次元配列の構造になっていることがほとんどです。
simplexml_load_file()関数を使うと、XMLオブジェクトが多次元配列の構造で返ってきて、XML_Unserializerを使うと、まんま配列で受け取れる。
(私は、simplexml_load_file()関数のほうが好きですが)

スポンサーリンク

で、ここのところAWS(アマゾンWebサービス)を利用したサイトをPHPで作っていたのですけど、foreach文を使うと、「Warning: Invalid argument supplied for foreach()」(警告:foreach文に無効な値が渡されました。)の警告文が頻繁に発生しました。
作成中のサイト ⇒ アマちぇっき(※ 申し訳ありませんが、あまチェキはサービスを終了しました。)(8割完成、動作確認まだ完全じゃないです)

原因は、XMLを処理後、出力のときにforeach文の中で、foreach文をもう一回使うことが多いため。
APIから返されるXMLの構造は、以下のような配列構造になっていることが多いです。(あるいは、二次元でなくもっと深い多次元配列の構造)

$array = array(
    0 => array('a', 'b', 'c'),
    1 => 'd',
    2 => array('e', 'f'),
    3 => '',
    4 => array('x', 'y', 'z')
);

配列構造をよく確認せずに、孫の部分も配列だろうと予測して、この$arrayに対して・・・

foreach ($array as $item) {
    foreach ($item as $value) {
        echo $value . ', ';
    }
    echo '<br />';
}

と、2回foreachで単純に回してしまうと、上記の警告文が出てしまう。

a, b, c, 
Warning: Invalid argument supplied for foreach() in ・・・
e, f, 
Warning: Invalid argument supplied for foreach() in ・・・
x, y, z, 

添え字が、1,3の要素は、値が配列ではないためです。
この警告文を避けるためには・・・

foreach ($array as $item) {
    if (is_array($item)) {
        foreach ($item as $value) {
            echo $value . ', ';
        }
    } else {
        echo $item;
    }
    echo '<br />';
}

と書いてやればよい。
$itemが配列かどうか確認した後に、foreachで回す。
そして、配列でない場合には、そのまま出力。

a, b, c, 
d
e, f, 

x, y, z, 

すると、今度は上記のように、予想通りにちゃんと表示されます。
$itemが配列要素の場合にのみ出力したければ・・・

foreach ($array as $item) {
    if (!is_array($item)) {
        continue;
    }
    foreach ($item as $value) {
        echo $value . ', ';
    }
    echo '<br />';
}

と書けば、実行結果は・・・

a, b, c, 
e, f, 
x, y, z,

と、表示されます。
ちょっと調べたところ、「Warning: Invalid argument supplied for foreach()」の警告文が出ているサイト、かなりたくさんあります。
foreach文で処理するために渡す値は、必ず配列でないといけないらしい。

スポンサーリンク
 
スポンサーリンク