判断表单数组需先isset再is_array严格验证,仅name含[]的字段PHP才解析为数组;复选框和多选下拉必须用name="xxx[]";关联数组要逐层isset+is_array检查;is_array可准确识别真数组,排除JSON对象、ArrayObject等伪数组。

接收表单数据时判断是否为数组,核心在于区分“浏览器提交的真数组”和“看似像数组的其他类型”,关键动作是:先安全取值,再用 is_array() 严格验证,不依赖名称后缀或 count() 等间接手段。
表单中多值字段必须用 [] 命名
只有 name 属性带方括号的字段(如 name="tags[]" 或 name="hobby[0]"),PHP 才会自动将其解析为数组。若写成 name="hobby",即使用户选了多个选项,也只会收到最后一个值(字符串),不会变成数组。
- 复选框组统一用
name="interests[]" - 多选下拉菜单同样使用
<select multiple name="cities[]"> - 避免混用:不要一部分用
hobby[],另一部分用hobby[1],否则 PHP 解析行为不可控
接收后第一步:isset + is_array 双重检查
不能跳过 isset 直接调用 is_array(),否则对未提交的字段会触发 Notice;也不能只用 empty() 或 count() 替代类型判断。
- 正确写法:
if (isset($_POST['items']) && is_array($_POST['items'])) { ... } - 错误写法:
if (count($_POST['items']) > 0)—— 对 null 或字符串也会返回 0,且可能报警告 - 错误写法:
if (!empty($_POST['items']))—— 字符串 "0"、空数组都会被判定为 false
关联键名数组要额外注意键是否存在
当表单使用带键的命名(如 name="user[name]"、name="user[email]"),PHP 会生成关联数组 $_POST['user'],但它本身是数组;而 $_POST['user']['name'] 是字符串,不是数组。
立即学习“PHP免费学习笔记(深入)”;
- 判断整个结构:
is_array($_POST['user'])→ true - 判断子项:
is_array($_POST['user']['name'])→ false(除非你故意提交了name="user[name][]") - 安全访问子项前仍需
isset($_POST['user']['name'])
警惕 ArrayObject、JSON 字符串等“伪数组”
用户可能通过接口伪造请求,传入 JSON 字符串或序列化数据,看起来像数组但实际不是。is_array() 能准确排除这些情况:
-
is_array(json_decode('[1,2,3]', true))→ true(因为第二个参数为 true,返回数组) -
is_array(json_decode('[1,2,3]'))→ false(返回对象) -
is_array(unserialize('a:3:{i:0;i:1;i:1;i:2;i:2;i:3;}'))→ true -
is_array(new ArrayObject([1,2,3]))→ false(它是对象,不是数组)



















