こんにちは、@Manabu です。
最近、PHPのバージョンをアップグレードした際に「in_array(): Argument #2 ($haystack) must be of type array, null given」というエラーが発生しました。
PHP7まででは、発生していなかったように感じるので、記事にしておきます。
この記事では、このエラーがなぜ発生するのか、どのように対処すればよいのかを具体的に解説します。
原因と解決策をしっかりと理解することで、同じエラーに再度悩まされることなく、安心して開発を進められるようになりますので、ぜひ参考にしてください!
in_array()関数とは?
in_array() 関数は、PHPで特定の値が配列内に存在するかどうかをチェックするための便利な関数です。
この関数を使うことで、配列の中に特定の要素が含まれているかを簡単に確認でき、条件分岐や検索処理に広く利用されています。
基本的な使い方
in_array(mixed $needle, array $haystack, bool $strict = false): bool
• $needle: 検索する値。配列の中で探したい要素を指定します。
• $haystack: 検索対象の配列。この配列の中に $needle が含まれているかをチェックします。
• $strict (オプション): 型を厳密にチェックするかどうかを指定するフラグ。デフォルトは false ですが、true にすると、$needle と同じ型の値が存在するかを厳密にチェックします。
以下のような感じで使用されます。
$fruits = ['apple', 'banana', 'orange'];
if (in_array('apple', $fruits)) {
echo 'Apple is in the list.';
} else {
echo 'Apple is not in the list.';
}
このコードでは、‘apple’ が $fruits 配列に含まれているため、Apple is in the list. が表示されます。
エラーの原因
今回発生した、「in_array(): Argument #2 ($haystack) must be of type array, null given」というエラーは、PHPの in_array() 関数で、第2引数($haystack)として渡されるべきものが配列ではなく、nullである場合に発生します。
PHP 8 では、型の厳密なチェックが行われるようになり、以前のバージョンでは許容されていたいくつかのコードが、PHP 8 以降ではエラーとなるケースがあります。
具体的な例
以下は、このエラーが発生する典型的なコード例です。
$needle = 'apple';
$haystack = null; // ここで、本来は配列が期待されるが、null が代入されている
if (in_array($needle, $haystack)) {
// 処理
}
このコードでは、$haystackという配列の中に、$needle(apple)が含まれているかを確認し、含まれる場合にIF文の中の処理を実行しようとしています。
$haystack が null なので、in_array() 関数は配列としての操作を試みますが、実際には null が渡されているため、当該のエラーが発生します。
解決策
このエラーを防ぐためには、in_array() 関数に渡される第2引数が必ず配列であることを確認する必要があります。
ここでは、エラーを未然に防ぐための具体的な解決策を紹介します。
is_array() を使った検証
最もシンプルで効果的な方法は、in_array() を実行する前に、is_array() 関数を使って第2引数が配列かどうかを確認することです。これにより、引数が null や他のデータ型の場合にエラーを防ぐことができます。
$needle = 'apple';
$haystack = get_data(); // ここで得られるデータが必ずしも配列であるとは限らない
if (is_array($haystack) && in_array($needle, $haystack)) {
// 処理
}
このコードでは、$haystack が配列であることを確認してから in_array() を実行するため、エラーを回避できます。
デフォルト値を設定する
配列の値がうまく取得できなく、nullが渡されてしまった場合に、空の配列をデフォルト値として設定することも有効的です。
これにより、in_array() が空の配列に対して実行され、エラーを防ぐことができます。
$needle = 'banana';
$haystack = get_data() ?? []; // `null` の場合は空の配列を代入
if (in_array($needle, $haystack)) {
// 処理
}
このコードでは、$haystack が null の場合でもエラーが発生せず、単に in_array() の結果が false になります。
まとめ
「in_array(): Argument #2 ($haystack) must be of type array, null given」というエラーは、PHP 8 以降で特に発生しやすくなった型チェックに起因するものです。
エラーが出てしまうようにはなりましたが、予期せぬ値の抜けがなくなる更新であるため、コーディングの質は上がりそうですね。
エラーを回避しつつ、より良いコードを記載してきましょう。