我有以下$_FILES
数组,从支持表单
Array
(
[file] => Array
(
[name] => Array
(
[0] => Test.jpg
[1] => Test.doc
[2] => Test.php
[3] =>
)
[type] => Array
(
[0] => image/jpeg
[1] => image/jpeg
[2] => image/jpeg
[3] =>
)
[tmp_name] => Array
(
[0] => /tmp/phpCO0vSD
[1] => /tmp/phpEFpp3Q
[2] => /tmp/phpwN4Iwc
[3] =>
)
[error] => Array
(
[0] => 0
[1] => 0
[2] => 0
[3] => 4
)
[size] => Array
(
[0] => 1305787
[1] => 339773
[2] => 480098
[3] => 0
)
)
)
我的主要问题是理解处理数组所需的逻辑,检查每个文件是否有效(我已经有一个有效扩展列表)然后重新命名并妥善存储文件。
对于我的简单要求,Google和SO上的解决方案都相当复杂。
答案 0 :(得分:6)
以下是遍历阵列的方法:
foreach ($_FILES['file']['name'] as $key => $name) {
echo $name;
echo $_FILES['file']['type'][$key];
echo $_FILES['file']['tmp_name'][$key];
}
有了这个循环,你可以轻松地做你想做的事。
答案 1 :(得分:5)
我非常喜欢foreach()
,我总是这样做......
$files = array();
foreach ($_FILES['files']['name'] as $num_key => $dummy) {
foreach ($_FILES['files'] as $txt_key => $dummy) {
$files[$num_key][$txt_key] = $_FILES['files'][$txt_key][$num_key];
}
}
...然后我再次使用foreach($files as $file)
来很好地处理数据。 :)
当然,来自zerkms的答案更快,但这对于任何情况重新排序数组逻辑都是一般的方法 - 你必须走两次(x * y)。
答案 2 :(得分:3)
以下是seoguru's answer的更通用的解决方案。它适用于文件输入字段,其名称包含任何级别的嵌套数组,例如file
,file[]
(此问题的大小写),file[english]
,file[english][]
等。
function rearrangeUploadArray(array $array) {
if(!is_array(reset($array)))
return $array;
$rearranged = [];
foreach($array as $property => $values)
foreach($values as $key => $value)
$rearranged[$key][$property] = $value;
foreach($rearranged as &$value)
$value = rearrangeUploadArray($value);
return $rearranged;
}
我意识到这个答案比这个问题要复杂得多,但也许它对某些人有用。示例用例是本地化上载表单,其中可以为不同语言上载多个文件。然后,为每种语言设置一个文件输入字段是有意义的,例如file[english][]
,file[german][]
,file[spanish][]
,等等。rearrangeUploadArray($_FILES['file'])
将返回一个数组形式
Array
(
[english] => Array
(
[0] => Array
(
[name] => ...
[type] => ...
[tmp_name] => ...
[error] => ...
[size] => ...
)
[1] => Array
(
[name] => ...
[type] => ...
[tmp_name] => ...
[error] => ...
[size] => ...
)
[...]
)
[german] => Array
(
[0] => Array
(
[name] => ...
[type] => ...
[tmp_name] => ...
[error] => ...
[size] => ...
)
[...]
)
[spanish] => Array
(
[0] => Array
(
[name] => ...
[type] => ...
[tmp_name] => ...
[error] => ...
[size] => ...
)
[...]
)
)
答案 3 :(得分:2)
基于来自here的clamcrusher解决方案的递归重新排序的另一种变体
contents overlap each other
与原始解决方案的主要区别在于我将array_merge_recursive替换为array_replace_recursive,以便树中的索引数组不会产生无效结果(索引数组的array_merge_recursive会添加新索引而不是与现有索引合并)。我已经在几个非常困难的情况下对它进行了测试,并且按预期工作了