フリーランス|WEB 制作経験丸7年、制作会社様からのご依頼に丁寧・高クオリティでお手伝いいたします。 IRODORI DESIGN

B L O G

【PHPエラー】Warning: foreach() argument must be of type array|objectの解決方法

PHP
Warning: foreach() argument must be of type array|object
エラー
トラブルシューティング
プログラミング

こんにちは、岐阜・名古屋を拠点に全国各地からご依頼いただくWEBサイトを制作しているフリーランスエンジニアの寺井です。

PHPでプログラムを作っていると突然表示されるエラー文章。突然エラーが表示されると焦ってしまいますよね。
今回の記事ではPHPエラーの中でもWarning: foreach() argument must be of type array|objectについて、原因から実際の具体例、その解決方法まで順を追って詳しく解説したいと思います。

Warning: foreach() argument must be of type array|objectとは

まずは実際にWarning: foreach() argument must be of type array|objectがどのように表示されるのか見てみましょう。
このエラーは以下の画像のように表示されます。

Warning: foreach() argument must be of type array|object, ●● given in ▲▲ on line ■■

このエラーが表示される原因はforeach文の引数が配列やオブジェクトではなく、数値、文字列だった場合に発生するエラーです。

  • ●●・・・間違って指定しているforeach文の引数の型
  • ▲▲・・・間違った型が指定している「ディレクトリ名/ファイル名」
  • ■■・・・エラーの原因となる処理が書かれている行数

つまり、「▲▲ファイルの■■行目でforeach文に配列やオブジェクトではない、●●型の値が指定されていている個所があるよ」ということを教えてくれています。

Warning: foreach() argument must be of type array|objectが起こる具体例

”foreach文に配列やオブジェクトではない値を指定している”と書きましたが、具体的にどういうことなのか、実際にこのWarning: foreach() argument must be of type array|objectが発生するコードを交えてご紹介します。

<?php

$data = "【PHPエラー】Warning: foreach() argument must be of type array|objectの解決方法";
foreach ($data as $key => $value) {
    echo $data;
}

?>

$dataは数値を格納した変数なのでforeach文の引数とすることは出来ません。変数をforeach文の引数に指定している為、Warning: foreach() argument must be of type array|object, string given inが表示されます。

上の例では変数の中身は文字列なので、エラーはstring given inとなり、これが数値だった場合は、in given inとなります。

Warning: foreach() argument must be of type array|objectの解決方法

それではこのエラーを解消する・回避する方法をご紹介します。

foreach文を使用しない

サンプルコードのように変数の中身を出力したいだけであればforeach文を使用する必要はありません。
以下のように直接$dataを出力することでWarning: foreach() argument must be of type array|objectを回避することが出来ます。

<?php

$data = "【PHPエラー】Warning: foreach() argument must be of type array|objectの解決方法";
echo $data;

?>

変数の中身を配列化する

foreach文は配列またはオブジェクトで無ければ引数として指定することは出来ません。
そのため、どうしてもforeach文を使用したい場合は変数を値を配列化してあげる必要があります。

具体的には以下のようなコードで変数を配列化します。

<?php

$data = "【PHPエラー】Warning: foreach() argument must be of type array|objectの解決方法";
$data = mb_str_split($data);
foreach ($data as $key => $value) {
    echo $value;
}

// var_dump( $data );
// array(69) { [0]=> string(3) "【" [1]=> string(1) "P" [2]=> string(1) "H" [3]=> string(1) "P" [4]=> string(3) "エ" [5]=> string(3) "ラ" [6]=> string(3) "ー" [7]=> string(3) "】" [8]=> string(1) "W" [9]=> string(1) "a" [10]=> string(1) "r" [11]=> string(1) "n" [12]=> string(1) "i" [13]=> string(1) "n" [14]=> string(1) "g" [15]=> string(1) ":" [16]=> string(1) " " [17]=> string(1) "f" [18]=> string(1) "o" [19]=> string(1) "r" [20]=> string(1) "e" [21]=> string(1) "a" [22]=> string(1) "c" [23]=> string(1) "h" [24]=> string(1) "(" [25]=> string(1) ")" [26]=> string(1) " " [27]=> string(1) "a" [28]=> string(1) "r" [29]=> string(1) "g" [30]=> string(1) "u" [31]=> string(1) "m" [32]=> string(1) "e" [33]=> string(1) "n" [34]=> string(1) "t" [35]=> string(1) " " [36]=> string(1) "m" [37]=> string(1) "u" [38]=> string(1) "s" [39]=> string(1) "t" [40]=> string(1) " " [41]=> string(1) "b" [42]=> string(1) "e" [43]=> string(1) " " [44]=> string(1) "o" [45]=> string(1) "f" [46]=> string(1) " " [47]=> string(1) "t" [48]=> string(1) "y" [49]=> string(1) "p" [50]=> string(1) "e" [51]=> string(1) " " [52]=> string(1) "a" [53]=> string(1) "r" [54]=> string(1) "r" [55]=> string(1) "a" [56]=> string(1) "y" [57]=> string(1) "|" [58]=> string(1) "o" [59]=> string(1) "b" [60]=> string(1) "j" [61]=> string(1) "e" [62]=> string(1) "c" [63]=> string(1) "t" [64]=> string(3) "の" [65]=> string(3) "解" [66]=> string(3) "決" [67]=> string(3) "方" [68]=> string(3) "法" }
?>

このようにすることでforeach文を使用して値を出力することが出来ます。
ただし、このmb_str_split()関数はPHP7.4.0以降のバージョンから使用することが出来ます。

まとめ

いかがでしたか?
プログラミングをしていると思わぬエラーに出くわすことがただあります。
そんな時はブラウザに表示されるエラー内容をよく確認し、エラーを解消しましょう。