直接用[]追加到最外层数组即可:$arr[] = ['name' => 'alice', 'age' => 30];错误写法如$arr[][]或echo $arr[]会报“cannot use [] for reading”;深层嵌套需先定位父级并加引用,避免空值报错。

直接用 [] 追加到最外层数组就行
多维数组本质还是数组,只要你想在最外层加一个新“行”(即一个子数组),就直接对原数组用空方括号追加:$arr[] = ['name' => 'Alice', 'age' => 30];。这和一维数组追加元素完全一致,PHP 会自动分配下一个整数键。
常见错误是误以为要写成 $arr[0][] 或嵌套索引——那是在往某一行的内部追加元素,不是加新行。
- 如果原数组是
$users = [['id'=>1, 'name'=>'Tom'], ['id'=>2, 'name'=>'Jerry']],加新用户只需:$users[] = ['id'=>3, 'name'=>'Alice']; - 不推荐用
array_push($arr, ...),它语义等价但多一次函数调用开销,且不能解构赋值 - 注意:若原数组使用了字符串键(如
['a'=>[...], 'b'=>[...]]),[]仍会加整数键,不会自动按字母顺序插入
想插到指定位置?用 array_splice()
如果新数据不能简单追加到最后,比如要插到第 2 行前面、或替换某一行,就得用 array_splice()。它能精准控制索引位置,且不影响其他键值对的结构。
示例:在索引 1 处插入新行(即插到第二行前):
$users = [['id'=>1, 'name'=>'Tom'], ['id'=>2, 'name'=>'Jerry']]; array_splice($users, 1, 0, [['id'=>99, 'name'=>'Admin']]);
参数含义:array_splice($arr, $offset, $length, $replacement),其中 $length=0 表示不删除,只插入。
- 若想替换第 0 行,把
$length改成1,$replacement就是新子数组 - 注意:如果原数组是关联键(非数字连续),
array_splice()会重置数字键,但保留原有字符串键;如需保持全部键名,得手动重建索引或用array_merge()拼接
追加时遇到“Cannot use [] for reading”错误
这个错误不是出在追加本身,而是你误写了类似 $arr[][0] = 'value'; 或 echo $arr[]; 这种读取空索引的语法。PHP 不允许对未定义的维度用 [] 做读操作。
- 正确写法只有:
$arr[] = ...(赋值)、$arr[$i][] = ...(往已存在的第$i行内追加) - 错误写法举例:
$arr[][] = 'x';(双重空索引)、$val = $arr[];(试图读取) - 调试技巧:用
var_dump($arr);确认当前结构,尤其检查是否意外把某个中间层级设成了null或字符串,导致后续无法当数组用
嵌套太深时,别手写索引链
如果你的数组是四层或五层深(比如 $data['users'][0]['profile']['address']['city']),又想往某个动态路径追加,硬编码索引极易出错且不可维护。
这时候应拆解逻辑:先定位目标父级(比如 $target = &$data['users'][0]['profile']['address'];),再对 $target 用 [] 追加。务必加引用(&),否则修改的是副本。
- 避免写
$data['users'][0]['profile']['address'][] = 'Beijing';—— 看似可行,但一旦中间某层不存在(如'profile'是null),就会报Trying to access array offset on null - 更健壮的做法是先用
isset()或 PHP 8 的空合并运算符?? []初始化缺失层级 - 复杂场景建议封装成小函数,比如
array_set_nested(&$arr, $path, $value),而不是反复手写长索引
[] 就够用;真正容易翻车的是嵌套层级判断和空值防护——这些地方不打日志、不加断点,线上出问题时很难一眼看出来。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











