PHP中array_filter()参数错误:传入null而非数组问题求助
解决PHP多文件上传时
array_filter()参数为null的问题 看起来你的核心问题是**$_FILES['fichier']['name']返回了null**,这直接导致array_filter()抛出警告。结合你提到的“法语版本正常、英语版本失效”,大概率是英语版的表单设置出了问题,和代码本身关系不大,咱们一步步排查:
1. 检查表单的文件输入name属性
多文件上传时,HTML文件输入的name必须带方括号[],这样PHP才会把多个文件解析成数组。你法语版的表单应该是这样的:
<input type="file" name="fichier[]" multiple>
请确认英语版的表单里,这个name是否还是fichier[]——很可能在翻译或修改页面时,不小心把name改成了其他值(比如files[]),或者漏掉了方括号,导致PHP无法识别为数组,最终$_FILES['fichier']不存在,返回null。
2. 必须设置表单的enctype属性
表单如果没有设置enctype="multipart/form-data",PHP完全无法接收上传的文件,$_FILES会是空数组。确保你的英语版表单标签是:
<form method="POST" enctype="multipart/form-data" action="你的处理脚本路径"> <!-- 其他表单元素 + 文件输入 --> </form>
这是文件上传的必要条件,法语版肯定是设置了的,英语版可能遗漏了。
3. 给代码增加容错性
为了避免后续再出现类似错误,建议在使用$_FILES前先做存在性检查:
// 先判断是否接收到合法的文件数组 if (!isset($_FILES['fichier']) || !is_array($_FILES['fichier']['name'])) { echo "错误:未接收到上传文件,请检查表单设置"; exit; } $files = array(); $count = count(array_filter($_FILES['fichier']['name'])); echo $count; for($i=0;$i<$count;$i++){ array_push($files, $_FILES['fichier']['tmp_name'][$i]); }
为什么法语版正常?
因为法语版的表单完全符合两个核心要求:name="fichier[]"和enctype="multipart/form-data",所以PHP能正确解析上传的文件数组;而英语版在页面修改过程中破坏了这两个设置,导致$_FILES['fichier']不存在,最终array_filter()接收到null参数报错。
内容的提问来源于stack exchange,提问作者Tweakdev




