最传统写法是array()函数,PHP 4起支持;PHP 5.4+推荐短语法[];动态追加用$arr[]或指定下标;混用键类型会触发强制转换,需谨慎验证整数键。

用 array() 函数创建索引数组
这是最传统、兼容性最好的写法,PHP 4 起就支持,至今仍完全可用。它明确表达“我要建一个数组”,适合需要向后兼容或团队规范要求显式声明的场景。
常见错误现象:漏掉括号、在键值对里误用 = 而不是 =>,导致语法错误或意外变成关联数组。
-
array("a", "b", "c")→ 自动生成索引0、1、2 -
array(0 => "a", 2 => "b", 5 => "c")→ 指定部分索引,后续自动递增("c"后再追加元素会从索引6开始) - 如果重复指定同一整数索引(如
array(0=>"x", 0=>"y")),后面那个会覆盖前面的
用短数组语法 [] 创建索引数组
PHP 5.4+ 引入,写起来更轻量,现在已是主流。它和 array() 功能完全等价,只是语法糖,生成的数组类型、行为、性能毫无区别。
容易踩的坑:在 PHP 5.3 或更老环境里直接用 [] 会报 Parse error: syntax error;另外新手可能误以为 [] 只能用于空数组,其实它完全支持带值初始化。
立即学习“PHP免费学习笔记(深入)”;
-
["a", "b", "c"]→ 等效于array("a","b","c") -
[0=>"a", 2=>"b"]→ 和array()中写法一致,也支持跳索引 -
["a", "b", "c",]→ 末尾逗号合法,便于版本控制时增删元素
运行时动态追加元素(隐式创建)
不预先声明数组,直接用 [] 或数字下标赋值,PHP 会自动创建并维护索引。这种写法灵活,但容易让数组结构变得稀疏或不可预测。
典型问题:中间跳过索引(如先 $arr[0]="x",再 $arr[5]="y"),导致 count($arr) 是 2,但 isset($arr[1]) 为 false,遍历时用 for 容易出错。
-
$arr[] = "first";→ 自动分配下一个可用整数索引(从 0 开始) -
$arr[10] = "tenth";→ 显式设索引,之后$arr[]会从 11 开始 -
unset($arr[0]);后再$arr[] = "new",不会填空,而是继续用当前最大索引 +1
混合写法与键名强制转换陷阱
PHP 数组本质是“有序映射”,所谓“索引数组”只是没有显式指定字符串键、且键恰好是连续整数的特例。一旦混用数字字符串键(如 "1")、浮点数键或布尔键,就会触发类型强制转换,结果可能不符合直觉。
最容易被忽略的一点:看似是索引数组,但只要出现 "0"、"1" 这类字符串数字键,PHP 就会把它转成整数 0、1,和其他数字键共存——这本身没问题,但若同时存在 0 和 "0",后者会被前者覆盖,且 print_r 输出时只显示一次。
-
array("0" => "a", 0 => "b")→ 实际只有[0] => "b",因为"0"被转成整数0 -
array(true => "x", 1 => "y")→true转为1,最终只有[1] => "y" - 用
is_numeric($key) && (int)$key == $key判断是否“真索引”不可靠,应优先用array_keys()+array_filter($keys, 'is_int')验证



















