处理多维$ _FILES数组

时间:2011-09-18 22:33:04

标签: php multidimensional-array

我有以下$_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上的解决方案都相当复杂。

4 个答案:

答案 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的更通用的解决方案。它适用于文件输入字段,其名称包含任何级别的嵌套数组,例如filefile[](此问题的大小写),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会添加新索引而不是与现有索引合并)。我已经在几个非常困难的情况下对它进行了测试,并且按预期工作了