1

我正在将一系列成对的“之前”和“之后”图像上传到 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 中循环。

那么,我可以指望 PHP 在构建 $_FILES 数组时保持输入顺序,还是有更好的方法来做到这一点?

谢谢!

4

2 回答 2

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, etc... 版本,您还可以执行类似的操作

$keys = preg_grep('/^after\d+$/', array_keys($_FILES['before']['tmp_name']));

这会给你数组:

 $keys = array(
    0 => 'after1',
    1 => 'after2', 
    ...
 )
于 2012-10-12T20:42:39.417 回答
0

当您使用名称字段创建一个数组时,如您在示例中所示,PHP 将按照它们在表单中提交的顺序提供一个数组。请注意,您实际上是在为此信任用户输入。也就是说,如果有任何事情(例如恶意创建的表单或 XSS 注入)要更改您的表单并发布,那么您的数据顺序可能会更改。这与任何其他类型的表单操作具有相同的风险。所以,PHP 不应该搞砸它,但黄金法则是不要相信用户输入。

于 2012-10-12T20:44:18.897 回答