
PHP 数组初始化和动态扩展,核心在于明确意图、避免隐式类型转换、减少运行时开销。直接用 [] 初始化最简洁安全;动态添加元素优先用 [] 语法而非 array_push(),除非批量追加;扩容前确认键名是否需保留,避免意外覆盖或重排。
初始化:用空数组字面量,别用 array()
PHP 5.4+ 推荐使用 [] 初始化,语义清晰、性能略优、写法更轻量。老式 array() 在 PHP 8.0+ 已无实质差异,但 [] 更符合现代习惯,也避免与函数名混淆(比如自定义了 array() 函数的极端情况)。
- ✅ 推荐:
$list = [];或$map = ['name' => 'Tom']; - ⚠️ 不必要:
$list = array();(可读性稍弱,多打字符) - ❌ 错误:
$arr = null; $arr[] = 'x';(会触发 notice,且语义模糊)
动态追加:单个元素用 [],多个用 array_push() 或解包
向数组末尾添加一个值,$arr[] = $value; 是最直接、高效的方式。它不检查参数、不调用函数、不计算数组长度,底层直接定位到末尾索引。而 array_push($arr, $value) 是函数调用,有额外开销,且在严格模式下可能因传参问题报错。
- ✅ 单个追加:
$items[] = 'apple'; - ✅ 批量追加(PHP 7.4+):
$items[] = ...$newItems;(解包语法) - ✅ 批量追加(兼容旧版):
array_push($items, ...$newItems);或循环[] - ❌ 避免:
array_push($items, 'apple');(单元素场景纯属冗余)
键名管理:明确区分索引数组与关联数组的扩展逻辑
PHP 数组本质是有序映射,但扩展行为取决于你如何指定键。未指定键时,PHP 自动分配下一个整数索引;显式指定字符串键则进入关联模式。混用易导致意外行为,比如 $a[0]='x'; $a['id']=123; $a[]='y'; 中最后的 [] 会生成键 1(不是 2),因为自动索引只看当前最大整数键。
立即学习“PHP免费学习笔记(深入)”;
- ✅ 索引数组:全程不写键,靠
[]自增,如日志列表、结果集 - ✅ 关联数组:始终显式写键,如
$user['email'] = 'a@b.c';,避免$user[] = ... - ⚠️ 警惕:
$data[0] = 'first'; $data['meta'] = 'info'; $data[] = 'last';→'last'的键是1,不是2
性能与安全:避免在循环中反复 count() 或隐式类型转换
动态扩展本身不慢,但常见反模式会拖慢性能或引发 bug。例如在 for 循环里每次调用 count($arr) 判断长度;或把字符串当数组用($str = 'abc'; $str[] = 'd';),PHP 会静默转成数组但丢失原始值。
- ✅ 提前缓存长度:
$len = count($arr); for ($i = 0; $i - ✅ 初始化即定类型:
$result = []; foreach ($rows as $row) { $result[] = transform($row); } - ❌ 禁止:
$s = 'hello'; $s[] = 'world';(结果是['h','e','l','l','o'],原字符串丢失) - ❌ 避免:
$arr += ['key' => $val];替代$arr['key'] = $val;(+=会合并整个右侧数组,且对已存在键不覆盖)
不复杂但容易忽略。初始化干净,追加明确,键名清醒,性能自然跟得上。











