1.4 数组:请求携带的行李清单


文档摘要

1.4 数组:请求携带的行李清单 本节摘要:PHP 把"一捆数据"统一装进数组:既是有序清单(索引数组),也是标签柜(关联数组),请求数据如 、 、 全是关联数组。本节讲清两种形态的组织方式与互转、常用遍历排序函数、多层嵌套的取值防坑,最后用"成批处理表单多行数据"的实战把它们串起来。 请求数据为什么都是数组 一次 HTTP 请求往往携带一捆数据:几个查询参数、一批表单字段、一堆请求头。PHP 在请求进站时就把它们整理成现成的数组,挂在超全局变量上等你取用。所以数组不是"可选知识点",而是服务端编程的水和电。看一眼就懂为什么: 键名就是表单控件的 name 属性,值就是用户填的内容(字符串,1.2 节讲过)。理解了"请求数据即数组",本章后面表单处理的悬念就只剩"怎么验、怎么防"了。

1.4 数组:请求携带的行李清单

本节摘要: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_maparray_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 前缀速记。
  • 成批处理骨架:整体兜底、逐行清洗、脏数据按策略处置——批量导入场景直接套用。

下一节看字符串:行李清点完了,还要处理行李上的标签文本,中文字符串的处理门道比想象的多。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U