PHP展开运算符要求操作数必须是数组或Traversable对象,否则报错;应使用(array)强制转换或safe_unpack函数安全处理null、false等非数组值。

这个错误说明你正试图用展开运算符(...)去“解开”一个**非数组、非可遍历对象**的值,比如 null、false、字符串、数字或未定义变量。PHP 要求被展开的必须是数组或实现了 Traversable 接口的对象,否则直接报错,不给你机会兜底。
检查每个待展开的变量是否为真实数组
展开前别假设它“应该是数组”。常见陷阱包括:
-
$_GET['filters']或$_POST['data']根本没传,结果是null或undefined - JSON 解码失败:
json_decode($json, true)返回null(比如格式错误),你却直接写[...$data['items']] - 函数返回
false表示失败(如get_option()在 WordPress 中找不到配置时),你没判断就展开
用 (array) 强制转换最简单可靠
对任何可能“不干净”的变量,加一层强制转数组,既安全又无副作用:
[...(array)$a, ...(array)$b, ...(array)$c]-
(array)对null、false、字符串、数字都返回空数组[];对已是数组的值原样返回 - 比
?? []更彻底——因为??只处理“null 和未定义”,而false、0、''会穿透过去,仍可能触发错误
避免在动态结构里盲目展开嵌套键
比如你想展开 $config['db']['hosts'],但 $config 或 $config['db'] 可能不存在或不是数组:
- ❌ 错误写法:
[...$config['db']['hosts']] - ✅ 正确写法:
[...(array)($config['db']['hosts'] ?? [])],或更稳妥:[...(array)($config['db']['hosts'] ?? null)] - 关键点:先确保最内层表达式有默认值或兜底,再套
(array)
封装一个安全展开辅助函数(可选)
如果项目中频繁遇到这类问题,可以定义一个轻量函数提升可读性:
function safe_unpack($value) { return is_array($value) ? $value : []; }
用法:[...safe_unpack($data), ...safe_unpack($extra)]
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











