会触发Notice;用isset($arr[$i])更合适,因它兼具存在性与非null判断且性能优,而array_key_exists()对索引数组冗余;??运算符等价于isset判断,简洁安全。

直接用 $arr[$i] 会触发 Notice 吗
会,而且很常见。当 $i 超出数组长度(比如 $arr = ['a', 'b']; echo $arr[5];),PHP 会报 Notice: Undefined offset: 5,但值为 null。这不是致命错误,但线上环境通常开启 E_NOTICE,日志会被刷爆。
isset($arr[$i]) 和 array_key_exists($i, $arr) 哪个更合适
对索引数组(数字下标),优先用 isset($arr[$i]):
-
isset()同时检查键存在且值不为null,对绝大多数场景够用 -
array_key_exists()会返回true即使$arr[$i] === null,但索引数组极少显式存null,多此一举 -
isset()性能略优,是语言结构而非函数调用
示例:
$arr = ['a', 'b', 'c']; $i = 10; $value = isset($arr[$i]) ? $arr[$i] : 'default'; // 安全,不报 Notice
用空合并运算符 ?? 是最简写法吗
是,但要注意它和 isset() 行为一致 —— 键不存在或值为 null 都触发默认值:
立即学习“PHP免费学习笔记(深入)”;
-
$value = $arr[$i] ?? 'fallback';简洁、可读、无 Notice - 它等价于
isset($arr[$i]) ? $arr[$i] : 'fallback',不是empty()判断 - 不能用于写操作(如
$arr[$i] ??= 'new'是语法错误)
注意:如果 $i 是变量且可能未定义(比如 $i = $input['index'] ?? null;),先确保 $i 是整型,否则会触发 Warning: Illegal offset type。
需要取多个连续下标时怎么避免重复判断
别一个个 ??,用 array_slice() + array_values() 更稳:
-
array_slice($arr, $start, $length, true)保留键名;加array_values()强制重排为纯数字索引 - 例如取下标 2~4:
$chunk = array_values(array_slice($arr, 2, 3)); - 如果起始位置越界,
array_slice()返回空数组,不会报错 —— 比手动isset循环干净得多
真正容易被忽略的是下标类型:索引数组的下标必须是 int,传字符串 "2" 会被自动转换,但传浮点数 2.5 或数组会直接报错。安全做法是提前 cast:$i = (int)$i;。



















