1.4 数组:请求携带的行李清单 本节摘要:PHP 把"一捆数据"统一装进数组:既是有序清单(索引数组),也是标签柜(关联数组),请求数据如 、 、 全是关联数组。本节讲清两种形态的组织方式与互转、常用遍历排序函数、多层嵌套的取值防坑,最后用"成批处理表单多行数据"的实战把它们串起来。 请求数据为什么都是数组 一次 HTTP 请求往往携带一捆数据:几个查询参数、一批表单字段、一堆请求头。PHP 在请求进站时就把它们整理成现成的数组,挂在超全局变量上等你取用。所以数组不是"可选知识点",而是服务端编程的水和电。看一眼就懂为什么: 键名就是表单控件的 name 属性,值就是用户填的内容(字符串,1.2 节讲过)。理解了"请求数据即数组",本章后面表单处理的悬念就只剩"怎么验、怎么防"了。
本节摘要:PHP 把"一捆数据"统一装进数组:既是有序清单(索引数组),也是标签柜(关联数组),请求数据如
$_GET、$_POST、$_SERVER全是关联数组。本节讲清两种形态的组织方式与互转、常用遍历排序函数、多层嵌套的取值防坑,最后用"成批处理表单多行数据"的实战把它们串起来。
一次 HTTP 请求往往携带一捆数据:几个查询参数、一批表单字段、一堆请求头。PHP 在请求进站时就把它们整理成现成的数组,挂在超全局变量上等你取用。所以数组不是"可选知识点",而是服务端编程的水和电。看一眼就懂为什么:
<?php // 访问 example.com/search.php?kw=php&page=2 时 var_dump($_GET); // array(2) { ["kw"]=> string(3) "php" ["page"]=> string(1) "2" } // POST 一张含 name、age 的表单时 var_dump($_POST); // array(2) { ["name"]=> string(6) "张三" ["age"]=> string(2) "28" } var_dump($_SERVER['REQUEST_METHOD']); // GET 或 POST,本节先用这一个
键名就是表单控件的 name 属性,值就是用户填的内容(字符串,1.2 节讲过)。理解了"请求数据即数组",本章后面表单处理的悬念就只剩"怎么验、怎么防"了。
索引数组按数字下标存值,像行李架上按序号摆放的包裹;关联数组按字符串键存值,像贴了标签的格子。声明与读取如下:
<?php $queue = ['张三', '李四', '王五']; // 索引数组,下标从 0 起 echo $queue[0], "\n"; // 张三 $queue[] = '赵六'; // 追加到队尾 echo count($queue), "\n"; // 4 $seat = ['name' => '张三', 'car' => 5, 'no' => '12F']; // 关联数组 echo "{$seat['name']} 坐在 {$seat['car']} 号车厢 {$seat['no']}\n"; // 张三 坐在 5 号车厢 12F
两者可以互相转换,也常常嵌套出现——比如"一列车的全部座位"就是外层按车厢号、内层按座位号的嵌套关联数组。下图把两种形态的组织方式画在同一张图里,右下角还标出了嵌套取值的路径:

嵌套读值是高频翻车点:直接取不存在的键会告警甚至中断。工程写法是 ?? 兜底或 isset 先探:
<?php $trips = [ 'G102' => ['from' => '南苑', 'seats' => ['12F', '12A']], ]; $first = $trips['G102']['seats'][0] ?? '无数据'; // 安全读取 echo $first, "\n"; // 12F
数组函数上百个,日常高频的就十来个。挑最常用的分组演示:
<?php $fares = ['慢车' => 60, '快车' => 120, '高铁' => 240, '动车' => 180]; // 查找类 var_dump(array_key_exists('高铁', $fares)); // true(键存在,值即使是 null 也算) var_dump(in_array(999, $fares)); // false(值存在性) echo array_search(180, $fares), "\n"; // 动车(按值反查键) // 提取类 print_r(array_keys($fares)); // 键清单:慢车 快车 高铁 动车 print_r(array_values($fares)); // 重新排成索引数组 print_r(array_slice($fares, 1, 2)); // 从下标 1 起取两项 // 排序类(注意:sort 系列会重排键,asort/ksort 保留键值对应) asort($fares); // 按值升序,键保留 print_r($fares); // 慢车 60 → 快车 120 → 动车 180 → 高铁 240
记一组速断口诀:array_key_exists 问键、in_array 问值、isset 问"键在且非 null";排序函数名里带 a 按值排、带 k 按键排、带 u 是自定义比较器。批量加工交给 1.3 节见过的 array_map 与 array_filter,一个变换一个筛选,配合起来能替代多数手写循环。
⚠️
foreach遍历中删元素:遍历副本没问题,但边遍历边unset当前数组容易跳项,先收集再删更稳。⚠️ 字符串键与数字键混用:PHP 会把纯数字字符串键自动转整数,
['1' => 'a']实际键是整数,调试时别被输出骗了。
真实业务里表单常一次交来一批数据(比如批量导入旅客名单),字段名写成 passengers[0][name] 的形式,PHP 会自动聚成嵌套数组。演示接收与清洗:
<?php // 表单提交 passengers[0][name]=张三 & passengers[0][age]=28 & passengers[1][name]=李四 ... $batch = $_POST['passengers'] ?? []; $clean = []; foreach ($batch as $row) { $name = trim((string) ($row['name'] ?? '')); $age = (int) ($row['age'] ?? 0); if ($name === '' || $age < 1) { continue; // 脏数据直接跳过,也可选择收集报错 } $clean[] = ['name' => $name, 'age' => $age]; } echo '有效记录:', count($clean), " 条\n"; print_r($clean); // Array ( [0] => Array ( [name] => 张三 [age] => 28 ) [1] => Array ( [name] => 李四 [age] => 31 ) )
处理思路值得复述一遍:先整体兜底(?? []),逐行取值并转换,脏数据按策略跳过或登记,最后留下干净清单交给下游——第 2.2 节会把这份清单一次性写进数据库。到这里,"行李清点"的能力就齐了。
$_GET、$_POST、$_SERVER 都是现成关联数组,键来自表单 name 与参数名。?? 与 isset。a/k/u 前缀速记。下一节看字符串:行李清点完了,还要处理行李上的标签文本,中文字符串的处理门道比想象的多。