2011-09-18 151 views
4

我已經通過用於處理以下$_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 
       ) 

     ) 

) 

我的主要問題是理解爲了處理該陣列所需要的邏輯,檢查每個文件是有效(我已經有一個有效的擴展名列表),然後重新命名並存儲文件。

在谷歌的解決方案和SO都爲我的簡單要求相當複雜。

+1

「的在谷歌的解決方案,因此也爲我簡單的要求都相當複雜。」 ---遍歷數組是不是一個火箭科學發現的一個片段與它的工作 – zerkms

+0

他們有完整的解決方案,我不能讓我的頭左右,因此這個問題 - 謝謝你的答案:) – lethalMango

+0

你有問題不是根本的麻煩,它是*只是遍歷數組*:-S – zerkms

回答

6

這裏是你將如何遍歷您的數組:

foreach ($_FILES['file']['name'] as $key => $name) { 
    echo $name; 
    echo $_FILES['file']['type'][$key]; 
    echo $_FILES['file']['tmp_name'][$key]; 
} 

有了這個循環,你可以做你想做什麼輕鬆。

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)。

+0

謝謝!這正是我需要的。如果您將使用多個上傳的文件進行任何高級處理,則此答案提供了一種更簡單的方法。 +1 – Nathan

2

這裏是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] => ... 
       ) 

      [...] 
     ) 
) 
1

基於clamcrusher的遞歸重新排序的另一變型從here

function getFixedFilesArray() { 
    $walker = function ($arr, $fileInfokey, callable $walker) { 
     $ret = array(); 
     foreach ($arr as $k => $v) { 
      if (is_array($v)) { 
       $ret[$k] = $walker($v, $fileInfokey, $walker); 
      } else { 
       $ret[$k][$fileInfokey] = $v; 
      } 
     } 
     return $ret; 
    }; 

    $files = array(); 
    foreach ($_FILES as $name => $values) { 
     // init for array_merge 
     if (!isset($files[$name])) { 
      $files[$name] = array(); 
     } 
     if (!is_array($values['error'])) { 
      // normal syntax 
      $files[$name] = $values; 
     } else { 
      // html array feature 
      foreach ($values as $fileInfoKey => $subArray) { 
       $files[$name] = array_replace_recursive($files[$name], $walker($subArray, $fileInfoKey, $walker)); 
      } 
     } 
    } 

    return $files; 
} 

從原始溶液的主要區別解決方案是,我取代array_merge_recursive與array_replace_recursive使得在樹索引數組不會產生無效結果(array_merge_recur對於索引數組,索引添加新索引而不是與現有索引合併)。我在幾個相當困難的情況下測試這和它的工作如預期