PHP能接收前端数组参数,需前端按name[]=val或name[key]=val格式传参,$_POST自动解析为索引或关联数组;JSON需手动读取php://input;FormData和表单同名多字段均支持,注意Content-Type匹配与安全过滤。
PHP默认能直接接收数组参数,但前提是前端传参方式和命名规则匹配。关键不是“能不能”,而是“怎么命名”和“是否被自动解析”。$_GET 和 $_POST 都原生支持形如 name[]=value1&name[]=value2 的键名,PHP会自动聚合成索引数组;如果用 name[key]=value,则自动转为关联数组。
fetch 或 axios 时,别直接传 JavaScript 数组对象——要序列化成符合 PHP 解析规则的键值对(如 FormData 或 URL 编码字符串)application/json),PHP 不会自动填充 $_POST,需手动调用 json_decode(file_get_contents('php://input'), true)
是最稳妥、兼容性最好的方式常见现象:前端明明传了数组,var_dump($_POST['items']) 却是 null 或空数组。根本原因通常是请求头与 PHP 解析机制不匹配。
Content-Type: application/x-www-form-urlencoded → 支持 name[]=... 自动解析,也支持 name[key]=...
Content-Type: application/json → $_POST 恒为空,必须读取原始输入:file_get_contents('php://input')
FormData 提交(含文件)→ Content-Type 是 multipart/form-data,此时 name[]=... 依然有效,且文件字段也会出现在 $_FILES 中PHP 支持多层嵌套数组命名,只要键名含方括号即可。例如 user[profile][age]=25 会被解析为:
$user = [
'profile' => ['age' => '25']
];
.)、空格或特殊字符,否则解析失败或截断filter_input(INPUT_POST, 'user', FILTER_SANITIZE_SPECIAL_CHARS, FILTER_REQUIRE_ARRAY) 做基础校验,但无法校验嵌套深度接收到的数组可能含恶意键名、超长值、非预期类型(比如字符串伪装成数组),直接遍历 $_POST['list'] 并拼 SQL 极易引发注入或崩溃。
is_array() 校验类型,再用 array_filter() 或 array_map('trim', ...) 清洗filter_var($v, FILTER_VALIDATE_INT),字符串用 htmlspecialchars() 或预处理语句绑定$_POST 中出现 0、false、null 字符串(如 "0"),它们在弱类型比较中容易误判$_POST;或者用了 FormData 但某个字段名漏写了 [],导致 PHP 当成字符串而非数组处理。这类问题不会报错,只会静默丢数据。