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文で処理するために渡す値は、必ず配列でないといけないらしい。
- - 関連記事 -
- strpos() や strcmp() など間違えやすいif文での判定
- htmlentities() と htmlspecialchars() の違い
- PHPの内部エンコードと出力文字コード、スクリプト文字コード
- PHPのデバッグ・xdebugをxamppで有効にする
- CakePHPの日本語対応、国際化
- コマンドラインでPHPが起動できない
- 直接ファイルが実行されたときだけ起動するスクリプト
- ディレクトリを探索してリンク一覧表示
- PHPとRubyのコードの書き方を比較
- コメントアウトの使い分けと、/*** ~ ***/とか// — を単語登録
- PHPでvar_dump()を使ったお手軽デバッグコード
- プログラミング練習問題をPHPで解いてみた
- CakePHPはMVCかつフルスタックのフレームワーク
- PHP5のクラス定義とオブジェクトのおさらい
- フレームワークCakePHPにチャレンジ
- sort・asort・ksort 配列を並べ替える関数
- foreach構文
- PHPの配列
- strcmp関数
- strcasecmp関数