直接用数组下标赋值是最常用方法:$arr[2] = 'new'可直接修改或创建元素;array_splice()适合替换连续段;对象属性需注意可见性;字符串应使用substr_replace()避免UTF-8乱码。

直接用数组下标赋值是最常用方法
PHP 数组是支持随机访问的,只要知道索引(数字或字符串键),就能直接修改对应位置的值。不需要调用特殊函数,$arr[2] = 'new' 这种写法就足够了。
注意:对不存在的索引赋值会自动创建该元素;对已存在的索引赋值则覆盖原值。
- 数字索引数组:确保索引在合法范围内,否则可能意外扩容(如
$arr[100] = 'x'会让数组跳过中间空位) - 关联数组:键名必须完全匹配,
$arr['name']和$arr['Name']是两个不同键 - 多维数组:可链式访问,如
$arr[0]['user']['age'] = 25,但要确保每层都已存在,否则会触发Notice: Undefined index
用 array_splice() 替换连续一段值
当需要替换从某个位置开始的一段元素(不止一个),且希望保持数组结构紧凑(不保留被删掉的空位),array_splice() 比手动 unset + insert 更可靠。
它会移除指定数量的元素,并插入新元素,同时返回被移除的部分。关键参数顺序是:array_splice($array, $offset, $length, $replacement)。
-
$offset支持负数(从末尾计数),比如-2表示倒数第二个位置 -
$length为 0 时,不删除任何元素,只插入(类似“在某位置插入”) - 原始数组会被修改(传引用),不加
&也能改,因为 PHP 7.4+ 对数组自动按引用处理 - 如果只是改单个值,别用它——语义不清、性能略低、易错写成
array_splice($arr, 2, 1, ['new'])却忘了它返回被删元素,干扰逻辑
修改对象属性值要注意引用和可见性
如果“指定位置”实际是指对象的某个属性(比如 $obj->data[3] 或 $obj->items[0]->id),得先确认属性是否可写。
- public 属性可直接赋值:
$obj->name = 'Alice' - private/protected 属性必须通过 setter 方法或反射,硬改会静默失败或报
Fatal error: Cannot access private property - 如果属性是数组,且你修改的是其中某个元素(如
$obj->list[1] = 'done'),要确保$obj->list已初始化,否则会 Warning - 对象属性如果是引用类型(如另一个对象),修改其内部值会影响所有持有该引用的地方;用
clone可切断引用关系
字符串指定位置替换要用 substr_replace()
别误用数组语法操作字符串——$str[5] = 'x' 虽然能运行,但仅适用于单字节编码(如 ASCII),在 UTF-8 下会破坏字符边界,导致乱码。
- 安全做法是用
substr_replace($str, $replacement, $offset, $length) -
$offset和$length都按字节数计算,UTF-8 多字节字符需先用mb_strlen($str, 'UTF-8')和mb_strpos()转换位置 - 若要替换 Unicode 字符位置(如“第3个汉字”),必须用 mb_* 函数配合,否则切出来的可能是半个汉字
- 正则替换(
preg_replace())适合按模式定位,不适合“第 N 个位置”这种精确索引场景
改数组下标、对象属性、字符串内容,各自有最匹配的工具。混用容易出编码错误或静默失败,尤其是字符串下标赋值和多字节文本打交道时,几乎必踩坑。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











