本記事ではPHPで、
「Invalid argument supplied for foreach()」
のWarningが発生する原因と対処法を解説していく。
「Invalid argument supplied for foreach()」が発生する原因
結論から先に言うと、Invalid argument supplied for foreach()が出る理由は、
foreach文に渡す変数が、配列でないことが原因だ。
$numbers = "1";
foreach($numbers as $num){ $numbersが配列でない → Invalid argument supplied for foreach()
foreach文の構文は、以下の様になっている
foreach (配列変数 as 要素を1つ入れる変数)
「Invalid argument supplied for foreach()」は、
配列変数を入れるはずのasの前の変数が配列変数ではなかった時かnullだった時に発生するWarningであるということだ。
「Invalid argument supplied for foreach()」の対処法
Invalid argument supplied for foreach()が出た時の対処法は、
foreach文に渡す変数を、配列で定義することだ。
$numbers = array("1"); 配列で定義する
foreach($numbers as $num){
シンプルだが「foreach文には配列型を渡す」という原則を守ることが一番の対処法だ。
意図せず配列以外の変数が渡るのを防ぐ方法
とは言え、コーディングにミスは付き物。
意図せず配列以外の変数がforeach文に渡ってしまっていたなんてことも考えられるので、
次にforeach文に意図せず配列以外の変数が渡るのを防ぐ方法を解説していく。
①「nullチェック」と「配列かどうかチェック」を入れる
「Invalid argument supplied for foreach()」のWarningは、配列変数を入れるはずのasの前の変数が配列変数ではなかった時かnullだった時に発生するWarningであると述べた。
なので、
「nullチェック」と「配列かどうかチェック」を入れることで、
Invalid argument supplied for foreach()のWarningが出るのを防ぐというのが最も素直な対策だ。
if ($numbers != null && is_array($numbers)) {
foreach($numbers as $num){
②(array)でキャストする
foreachのasの前の変数を、(array)でキャストすることでも
「Invalid argument supplied for foreach()」のWarningを防ぐことができる。
foreach((array)$numbers as $num){
キャストとは指定した型で変数を扱うようにする処理のことだ。
(array)でキャストすることで、foreachに渡す変数が配列ではなかった場合でも、強制的に配列として扱うことができる。以下はサンプルプログラム。
$numbers = "1";
foreach((array)$numbers as $num){
echo $num;
}
(array)でキャストすることによって、$numbersは”1″という要素を1つだけ持つ配列として扱われるため、「Invalid argument supplied for foreach()」のWarningが出ることはない。
(array)でキャストはnullにも対応できる
(array)でキャストはnullにも対応可能だ。
$numbers = null;
foreach((array)$numbers as $num){
echo $num;
}
$numbersは中身が空の配列と扱われるので、上記の$numbersは以下と同じになる。
$numbers = array();
※(array)を使う時は注意すること
(array)でキャストすることで解決した場合、「Invalid argument supplied for foreach()」のWarningを出さないという意味では解決できているものの、配列でない変数やnullが渡ってくるといった想定外の挙動自体を解決しているわけではない。
その場合、「Invalid argument supplied for foreach()」のWarningを出さないことよりも、配列でない変数やnullが渡ってくる元々のコード自体に問題があるので、そちらを解決するべきだろう。
関連記事
https://www.php.net/manual/ja/control-structures.foreach.php
https://www.php.net/manual/ja/class.invalidargumentexception.php
https://qiita.com/takuma-jpn/items/678876ad12b9ae9998ac
コメントを残す