php数组创建有字面量[]和Array()两种方式,推荐php 5.4+用[];foreach报错因参数非数组,需is_array()或??[]防护;for仅适用于连续数字索引数组;修改原数组值须用&$value并unset避免引用残留。

PHP里怎么写一个数组,有哪些常见写法
PHP数组创建其实就两种主流方式:字面量语法和array()函数。PHP 5.4+ 推荐用[],更简洁、可读性好,也和现代语言习惯一致。
注意:array()在PHP 8.0+仍可用,但已不推荐用于新代码;如果项目要兼容老版本(如PHP 5.3),才必须用array()。
-
$arr = [];—— 空索引数组 -
$arr = ['a', 'b', 'c'];—— 索引数组,键自动为0,1,2 -
$arr = ['name' => 'Tom', 'age' => 25];—— 关联数组,键显式指定 -
$arr = [0 => 'first', 2 => 'third'];—— 混合索引,键不连续时后续元素会按规则补位(比如1会被跳过)
foreach遍历数组时为什么有时报“Invalid argument supplied for foreach()”
这个错误只说明一件事:foreach收到的不是数组,而是NULL、String、int或未定义变量。它不会因为数组为空而报错——空数组[]是完全合法的遍历目标。
常见踩坑点:
立即学习“PHP免费学习笔记(深入)”;
- 函数返回值没检查,比如
$data = json_decode($json);失败时返回null,直接foreach($data as ...)就崩 - 从
$_GET/$_POST取值时,参数未传导致是null或string(比如$_GET['ids'] = "1,2,3",不是数组) - 变量名拼错,比如
$userList写成$userlist,变成未定义变量
安全写法是加类型判断:if (is_array($data)) { foreach($data as ...) },或者用?? []提供默认空数组:foreach($data ?? [] as $item)。
for循环能遍历所有PHP数组吗
不能。只有纯索引数组(键为连续整数,从0开始)才能放心用for。一旦数组键不规则(比如[2 => 'a', 5 => 'b'])、含字符串键(关联数组)、或使用unset()删过元素,for($i=0; $i<count>就会漏数据甚至报<code>undefined index警告。
原因很简单:count()只管元素个数,不管键是否连续;$arr[$i]则严格依赖键存在。
所以除非你100%确定数组是range()式生成或用array_values()重排过键,否则别用for遍历PHP数组。真要用,先转:$indexed = array_values($arr); for(...) { echo $indexed[$i]; }。
遍历中修改数组元素,用$key => $value还是&$value
想在foreach里改原数组的值,必须用引用&$value。只写$value是副本,改了也没用。
但要注意副作用:引用变量在循环结束后依然存在,可能影响后续逻辑。PHP会警告“Undefined variable”或引发意外覆盖。
- 安全写法:
foreach($arr as $key => &$value) { $value .= '_done'; } unset($value);—— 循环后unset掉引用 - 如果还要用
$key改键对应的值,直接$arr[$key] = ...更清晰,也不用担心引用残留 - 修改结构(比如
unset($arr[$key]))可以在普通foreach里做,但不建议边遍历边删,容易跳过元素;应先收集要删的键,再统一删
最易被忽略的是引用残留问题——很多人写了&$value却忘了unset,结果下一次循环或同作用域其他代码意外改了前一次的引用变量。