我正在将一系列配对的“之前”和“之后”图像上传到PHP脚本。在处理上传时,我必须确保匹配正确的“之前”和“之后”图像。
如果我这样做:
before: <input type="file" name="image[]"> after: <input type="file" name="image[]">
before: <input type="file" name="image[]"> after: <input type="file" name="image[]">
然后只是循环遍历image []数组,我可以依赖PHP维护正确的顺序吗?
同样的问题适用我认为如果我改为:
before: <input type="file" name="before[]"> after: <input type="file" name="after[]">
before: <input type="file" name="before[]"> after: <input type="file" name="after[]">
在那里,我仍然需要确保before []数组和after []数组是有序的,而且现在我必须在任何循环中协调这两个。
或者我可以做
before: <input type="file" name="before1"> after: <input type="file" name="after1">
before: <input type="file" name="before2"> after: <input type="file" name="after2">
etc....
(可能是我在.net中会做的)但是我不太确定如何在PHP中循环使用它。
那么,在构建$ _FILES数组时,我可以指望PHP维护输入顺序还是有更好的方法来做到这一点?
谢谢!
答案 0 :(得分:1)
您可以在php-array扩展名中强制使用数组键,例如
name="before[1]" name="after[1]"
name="before[2]" name="after[2]"
并且PHP将在处理表单数据时使用这些键创建数组条目
或者,您可以简单地使用
foreach(array_keys($_FILES['before']['tmp_name'])) as $key) {
processFile($_FILES['before']['tmp_name'][$key]);
processFile($_FILES['after']['tmp_name'][$key]);
}
请注意,PHP有一种处理基于数组的文件上传的模式,并且必须循环['tmp_name']
属性(或$ _FILES数组中的任何其他属性)。
对于您的before1
,before2
等版本,您还可以执行类似
$keys = preg_grep('/^after\d+$/', array_keys($_FILES['before']['tmp_name']));
它会给你数组:
$keys = array(
0 => 'after1',
1 => 'after2',
...
)
答案 1 :(得分:0)
当您使用name字段创建一个数组时,如您在示例中所示,PHP将提供与表单中提交的数组相同的顺序。请注意,您基本上信任用户输入。也就是说,如果ANYTHING(例如,恶意创建的表单或XSS注入)要更改您的表单并发布该表单,那么您的数据顺序可能会发生变化。这与任何其他形式的操作风险相同。因此,PHP不应该使用它,但黄金法则不是要信任用户输入。