PHP8.1升级后in_array报错:参数2应为数组却传入布尔值
解决PHP 8.1升级后in_array()的TypeError问题(ACF场景)
问题原因
- PHP版本类型校验差异:PHP 8.1对函数参数类型的校验更严格,
in_array()要求第二个参数必须是数组;而PHP 7.4会自动将布尔值隐式转换为数组(false转为空数组),所以之前不会触发错误。 - ACF函数返回值特性:你看到的
Array ( [0] => 1 )是字段有值时的正常输出,但当子字段不存在、未设置值,或者在ACF循环(如repeater、flexible content)外部调用get_sub_field()时,该函数会返回false,这就导致in_array()接收到布尔值参数,触发TypeError。
最优解决方法
方法1:强制确保参数为数组(推荐)
通过默认值处理,让get_sub_field()的返回值始终是数组,避免类型错误:
// 用空数组作为默认值,确保$categories始终是数组类型 $categories = get_sub_field('category') ?: []; if (in_array($cat->cat_ID, $categories)) { // 你的业务逻辑代码 }
方法2:先判断类型再执行逻辑
先检查返回值是否为数组,再调用in_array():
$categories = get_sub_field('category'); // 先验证类型,再执行in_array判断 if (is_array($categories) && in_array($cat->cat_ID, $categories)) { // 你的业务逻辑代码 }
额外检查点
确认get_sub_field('category')的调用上下文:必须在ACF的循环字段(如repeater)内部调用,如果是顶级字段,应该改用get_field('category');同时检查字段名称是否拼写正确,避免因字段不存在返回false。
内容的提问来源于stack exchange,提问作者Mathew Smith
相关产品推荐
相关产品推荐

