根本原因是被展开的变量为null、false、未定义或非数组,PHP尝试对其键访问时报“Undefined array key”;必须确保每个展开项是有效数组,可用(array)转换或??[]兜底。

用展开运算符(...)合并数组时出现 Undefined array key,根本原因不是展开语法本身出错,而是你试图展开的**某个变量本身是 null、false、未定义,或根本不是数组**——PHP 在展开前会尝试读取该变量的“键”,而它压根不支持键访问,于是报这个警告。
检查被展开的变量是否为有效数组
展开运算符要求操作数必须是可遍历的数组(或 Traversable 对象)。如果写成:
$a = $_GET['filters'] ?? [];<br>$b = $_POST['options']; // 但 $_POST['options'] 根本没传,$b 就是 null<br>$merged = [...$a, ...$b]; // ⚠️ 这里 $b 是 null,PHP 试图展开 null → Warning
解决方法:确保每个被展开的值都先转成数组。
- 用
(array)强制转换:[...(array)$a, ...(array)$b] - 更稳妥地结合空合并:
[...($_GET['filters'] ?? []), ...($_POST['options'] ?? [])] - 对可能为字符串、数字、null 的变量,别直接展开;先判断:
is_array($x) ? ...$x : []
避免在函数返回值上盲目展开
比如调用一个可能返回 false 或 null 的配置读取函数:
$config = getConfig('db'); // 可能返回 false 当配置不存在<br>$dsn = [...$config['connection'], 'charset=utf8']; // ❌ $config 可能是 false,展开时报错
正确做法是分步校验:
- 先确认
$config是数组:is_array($config) && isset($config['connection']) - 再展开:
[...($config['connection'] ?? []), 'charset=utf8'] - 或者封装安全展开函数:
function safe_spread($arr) { return is_array($arr) ? ...$arr : []; }
注意多维结构中的“假数组”陷阱
有时你以为是数组,其实是 JSON 解码失败后的 null:
$json = file_get_contents('data.json');<br>$data = json_decode($json, true); // 若 JSON 无效,$data 是 null<br>$items = [...$data['items']]; // ❌ 展开 null['items'] → Undefined array key "items"
务必先验证解码结果:
if (json_last_error() === JSON_ERROR_NONE && is_array($data)) { ... }- 或直接默认兜底:
$items = ...($data['items'] ?? []);(但前提是$data确保是数组)
别混淆展开和赋值逻辑顺序
错误写法:
$params = [...$_GET['id'], ...$_GET['sort']]; // 如果 $_GET['id'] 未传,直接报错
正确写法(逐个防御):
$id = $_GET['id'] ?? [];$sort = $_GET['sort'] ?? [];$params = [...$id, ...$sort];
这样即使某一项缺失,也不会中断执行,且语义清晰。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











