能,但必须是变量的值而非变量名本身;$arr[$key]中$key经求值后为字符串或整数才可作下标,常见错误源于$key未定义、类型隐式转换或逻辑混淆,安全做法是校验键存在性、显式类型转换并过滤输入。

$arr[$key] 中的 $key 是求值后得到一个字符串或整数,然后 PHP 拿这个**结果值**去查数组;它不会、也不能把 $key 这个名字当成键(比如自动变成 "key")。这点常被误解,也是多数报错的根源。
为什么 $arr[$key] 看起来“不工作”?
常见错误不是语法问题,而是运行时值出错:
-
$key未定义 → 报 Notice: Undefined variable -
$key值为null、false或空字符串 → 被转成""或0,查不到预期键 -
$key是浮点数(如3.7)→ 自动截断为3,和你预期的字符串键不匹配 - 你本意想用变量名(如
$name)当键,却写了$arr[$name],而实际要的是$arr["name"]—— 这属于逻辑混淆,不是语法限制
$arr[$key] 的合法类型有哪些?
PHP 允许下标是以下类型的变量值(运行时求值后):
- 整数:如
$key = 2→$arr[2] - 字符串:如
$key = "status"→$arr["status"] - 布尔值:
true→ 转为1,false→ 转为0 - 浮点数:如
4.9→ 截断为4(不是四舍五入) - NULL:转为空字符串
"",容易误匹配$arr[""]
注意:array_key_exists($key, $arr) 和 isset($arr[$key]) 行为不同——前者认 NULL 键,后者不认。别混用。
怎么安全地用变量当数组下标?
关键不是“能不能”,而是“值是否可控、是否已存在”。建议:
- 读取前先校验:
if (array_key_exists($key, $arr) && $key !== null) - 避免隐式转换:显式强转,如
(string)$key或(int)$key,尤其当你依赖字符串键时 - 对用户输入或 API 返回的键名做白名单过滤,别直接拼进数组访问
- 用空合并操作符防 Notice:
$val = $arr[$key] ?? 'default';(PHP 7+) - 别用
${$key}或$arr{"$key"}这类写法——花括号在数组下标中**完全多余**,$arr[$key]就够了;${$key}是变量变量,和数组下标无关
$key,但没 return 或引用传参,外层还是旧值;又或者用了 foreach ($arr as $key => $val) 后继续拿这个 $key 去查别的数组——它只代表最后一次循环的键,未必是你想要的那个。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











