一、为什么你的文件上传代码总是“差点意思”?
你有没有经历过这种抓狂时刻?用户兴冲冲选了10个文件,点击上传——页面突然报错:“文件类型不支持!”但最气人的是,你根本不知道是第几个文件出了错!或者更惨:10个文件只传成功了3个,用户还得像挖宝一样猜到底哪些传上去了。
传统的文件上传教程,多半是这样的套路:
if(isset($_FILES['file'])){
$name = $_FILES['file']['name'];
$tmp_name = $_FILES['file']['tmp_name'];
//... 一堆重复代码
}
但一旦遇到多文件上传,代码瞬间变成“俄罗斯套娃”:
for($i=0; $i<count($_FILES['file']['name']); $i++){
$name = $_FILES['file']['name'][$i];
$tmp_name = $_FILES['file']['tmp_name'][$i];
//... 循环里还是一堆重复代码
}
看着就累对不对?今天我要给你展示的,是另一种“魔法般”的写法——用PHP数组函数把多文件上传变成一条优雅的数据流水线。
二、$_FILES:PHP里最“精分”的数组结构
先来破解多文件上传的核心谜团:$_FILES这个超级数组到底长啥样?
假设你的HTML表单是这样的:
<input type="file" name="photos[]" multiple>
<input type="file" name="doc" accept=".pdf">
用户上传了两个图片和一个PDF后,$_FILES会变成一个“精分患者”:
Array
(
[photos] => Array
(
[name] => Array
(
[0] => "聚会照.jpg"
[1] => "自拍.png"
)
[type] => Array
(
[0] => "image/jpeg"
[1] => "image/png"
)
//... 其他字段也是同样结构
)
[doc] => Array
(
[name] => "报告.pdf"
[type] => "application/pdf"
//... 单文件是直接值,不是数组!
)
)
看到没?多文件上传时,每个字段都变成了数组;但单文件上传时,它又变回普通键值对。这种“精分”设计,让很多新手直接懵圈。
三、数组函数“梦之队”出场
处理这种混乱结构,正是PHP数组函数大展身手的舞台!我们先认识今天的主角们:
1. array_map() - 流水线上的机械臂
想象一下工厂流水线:原材料(原始数据)进去,经过机械臂(处理函数)加工,成品(新数组)出来。
// 传统写法:手动循环
$squared = [];
foreach([1,2,3,4] as $num){
$squared[] = $num * $num;
}
// 数组函数写法:一条流水线
$squared = array_map(fn($num) => $num * $num, [1,2,3,4]);
2. array_filter() - 严格的质检员
只让符合条件的元素通过,不合格的直接踢出流水线。
// 只保留偶数
$evens = array_filter([1,2,3,4], fn($num) => $num % 2 == 0);
3. array_column() - 专业的摘果器
从多维数组里,精准摘出某一列的值。
$users = [
['id'=>1, 'name'=>'张三'],
['id'=>2, 'name'=>'李四']
];
$names = array_column($users, 'name'); // ['张三', '李四']
4. array_reduce() - 数据压缩大师
把整个数组压缩成一个值,比如求和、求积。
$total = array_reduce([1,2,3,4], fn($carry, $item) => $carry + $item, 0);
四、实战:用数组函数重构多文件上传
好了,理论说够了,直接上代码!我们要实现一个功能完整的文件上传处理类。
Step 1: 统一数据结构(解决$_FILES的“精分”问题)
首先,不管单文件还是多文件,我们都统一成相同的结构:
class SmartUploader {
/**
* 把$_FILES的混乱结构转换成统一格式
* @param array $files $_FILES数组
* @return array 统一结构的多维数组
*/
private function normalizeFiles(array $files): array {
$result = [];
foreach($files as $fieldName => $fileArray){
用PHP数组函数玩转多文件上传

最低0.47元/天 解锁文章
283

被折叠的 条评论
为什么被折叠?



