HOWTO · PHP

PHP 警告 foreach() に無効な引数が指定されました

このチュートリアルでは、foreach() に指定された PHP 警告の無効な引数を修正する方法を示します。

このページの内容

このチュートリアルでは、PHP 警告: foreach() に指定された無効な引数 を修正する方法を示します。

PHP 警告: Foreach() に無効な引数が指定されました

PHP で foreach ループを使用すると、警告: foreach() に無効な引数が指定されましたという警告が発生することがあります。 この警告は、foreach ループに無効な引数を指定すると発生します。

このエラーの一般的な理由は、文字列を値として foreach ループに渡そうとしたときです。 foreach ループは配列を反復処理するために使用されますが、配列ではない値を指定すると、警告: foreach() に指定された引数が無効です がスローされます。

このエラーをスローする簡単な例を試してみましょう。

<?php
$DemoString = "Hello! This is delftstack.com";
foreach($DemoString as $DemoValue){
    echo $DemoValue;
}
?>

foreach() は文字列を反復処理できないため、上記のコードは Invalid argument provided for foreach() エラーをスローします。

出力を参照してください。

Warning: Invalid argument supplied for foreach() in C:\Apache24\htdocs\demo.php on line 3

この問題を解決するには、foreach ループに配列を提供する必要があります。 この例を修正してみましょう。

<?php
$DemoString = array("Hello!",  "This",  "is",  "delftstack.com");
foreach($DemoString as $DemoValue){
    echo $DemoValue."<br>";
}
?>

文字列を配列に変更したので、この警告は修正されるはずです。 出力を参照してください。

Hello!
This
is
delftstack.com

foreach() に指定された無効な引数 は文字列だけで発生するのではなく、配列のように反復可能でない値はすべて同じ警告をスローします。

関数の戻り値を反復しようとする別の例を次に示します。

<?php
function DemoArray () {
    return false;
}

$DemoArray = DemoArray();

foreach($DemoArray as $DemoValue) {
    echo $DemoValue;
}
?>

ご覧のとおり、DemoArray() 関数は false を返しています。これを変数に代入し、foreach() ループを使用して反復処理を試みています。 foreach() に無効な引数が指定されましたという警告がスローされるはずです。

出力を参照してください。

Warning: Invalid argument supplied for foreach() in C:\Apache24\htdocs\demo.php on line 8

理想的には、この問題を修正するには、メソッド DemoArray() が配列を返す必要がありますが、このような状況が発生することもあります。 問題を繰り返し修正するよりも、デフォルト値でこれらの状況を処理することをお勧めします。

この状況をデフォルト値で処理してみましょう。

<?php
function DemoArray() {
    return false;
}

$DemoArray = DemoArray();

if (is_array($DemoArray) || is_object($DemoArray)) {

    foreach($DemoArray as $DemoValue){
        echo $DemoValue;
    }
}
// In case the above method is not working, we set a default value in the else, or we can perform any other operations.
else  {
	$DemoArray = array("Hello!",  "This",  "is",  "delftstack.com");
    foreach($DemoArray as $DemoValue){
        echo $DemoValue."<br>";
    }
}
?>

上記の例は適切に処理されるようになりました。 そのため、foreach ループで状況が発生するたびに、少なくともエラー ステートメントのデフォルト値が必要です。

出力を参照してください。

Hello!
This
is
delftstack.com