2012-05-28 40 views
3

這可能是個愚蠢的問題,但PHP數組$ _FILES有非常奇怪的格式,我從來沒有使用過。有人能告訴我如何以理智的方式迭代這個數組?我已經習慣了像數組一樣迭代對象或對象,但是這種格式對我來說很奇怪。有什麼辦法像對象數組一樣迭代這個數組嗎?

([attachments] => 
    Array ( 
     [name] => Array ( 
      [0] => test1.png 
      [1] => test2.png 
     ) 
     [type] => Array ( 
      [0] => image/png 
      [1] => image/png 
     ) 
     [tmp_name] => Array ( 
      [0] => /tmp/phpmFkEUe 
      [1] => /tmp/phpbLtZRw 
     ) 
     [error] => Array ( 
      [0] => 0 
      [1] => 0 
     ) 
     [size] => Array ( 
      [0] => 9855 
      [1] => 3002 
     ) 
    ) 
) 
+0

你喜歡什麼樣的退貨價值?你是否想簡單地遍歷數組的各個元素? ('name','type'等) – Nathanael

+0

使用foreach http://fi.php.net/foreach – iiro

回答

11

哇,這的確很奇怪,你在標記中使用<input type="file" name="attachments[]" />?如果你有能力改變那些使用獨特name=,你會不會有奇怪的格式...

直接回答你的問題,請嘗試:

$len = count($_FILES['attachments']['name']); 

for($i = 0; $i < $len; $i++) { 
    $fileSize = $_FILES['attachments']['size'][$i]; 
    // change size to whatever key you need - error, tmp_name etc 
} 
+0

我相信他可能會使用相同的文件名來允許多個文件輕鬆上傳。雖然我同意,'$ _FILES'的數組非常奇怪。 – dpk2442

+0

他肯定使用'',這樣他就可以用一個字段上傳多個文件。所以不可能使用不同的名稱。這可能並不直觀,但這就是PHP處理這種情況的方式,現在多文件上傳是HTML的一部分,這種情況才更爲常見。 – Okonomiyaki3000

+0

@ Okonomiyaki3000 doumo –

4

最簡單的方法是:

$files = $_FILES['attachments']['name']; 
$count = 0; 
foreach ($files as $file) { 
    $file_name = $file; 
    $file_type = $_FILES['attachments']['type'][$count]; 
    $file_size = $_FILES['attachments']['size'][$count]; 
    ... 
    ... 

    ++$count; 
} 
3

這是迭代$ _FILES的唯一方法。

foreach ($_FILES['attachments']['tmp_name'] as $k => $v) { 
    echo $_FILES['attachments']['name'][$k]; 
    echo $_FILES['attachments']['type'][$k]; 
} 
2

這樣?

foreach((array)$_FILES["attachments"] as $val) { 
    foreach((array)$val["name"] as $name) { 
     // $name = "test1.png",... 
    } 
    foreach((array)$val["type"] as $type) { 
     // $type = "imagepng",... 
    } 
} 
1

我曾嘗試小規模示威,看看

<html> 
<body> 
<form enctype="multipart/form-data" method="post"> 
<input type="file" name="file[]" /> 
<input type="file" name="file[]" /> 

<input type="submit" name="submit" /> 
</form> 
<body> 
</html> 
<?php 
if($_SERVER['REQUEST_METHOD']=='POST'){ 
    foreach ($_FILES as $k=>$v){ 
    if(is_array($v)){ 
     foreach ($v as $sk=>$sv){ 
       $arr[$sk][$k]=$sv; 
     } 
     } 
    } 
    echo "<pre>"; 
    print_r($arr); 
} 
?> 

輸出

Array 
(
    [name] => Array 
     (
      [file] => Array 
       (
        [0] => 4_Milestone text (1).doc 
        [1] => 2x5 ko condolence ad.jpg 
       ) 

     ) 

    [type] => Array 
     (
      [file] => Array 
       (
        [0] => application/msword 
        [1] => image/jpeg 
       ) 

     ) 

    [tmp_name] => Array 
     (
      [file] => Array 
       (
        [0] => C:\xampp\tmp\php15EF.tmp 
        [1] => C:\xampp\tmp\php163E.tmp 
       ) 

     ) 

    [error] => Array 
     (
      [file] => Array 
       (
        [0] => 0 
        [1] => 0 
       ) 

     ) 

    [size] => Array 
     (
      [file] => Array 
       (
        [0] => 20480 
        [1] => 56642 
       ) 

     ) 

) 
4

我一直認爲這個結構爲無稽之談。所以每當我使用多輸入文件中的字段,我這樣做:

$files = array_map('RemapFilesArray' 
    (array) $_FILES['attachments']['name'], 
    (array) $_FILES['attachments']['type'], 
    (array) $_FILES['attachments']['tmp_name'], 
    (array) $_FILES['attachments']['error'], 
    (array) $_FILES['attachments']['size'] 
); 

function RemapFilesArray($name, $type, $tmp_name, $error, $size) 
{ 
    return array(
     'name' => $name, 
     'type' => $type, 
     'tmp_name' => $tmp_name, 
     'error' => $error, 
     'size' => $size, 
    ); 
} 

然後,你將有一個數組,你可以迭代和每個項目將是相同的結構,你會用得到的關聯數組一個正常的單個文件輸入。所以,如果你已經有了一些處理這些東西的函數,你可以把這些東西都傳給它,而不需要修改。

順便說一下,將所有輸入作爲數組進行投射的原因是,即使您忘記將[]放在文件輸入的名稱上(當然,在這種情況下您只會得到一個文件,但它比打破更好)。

+0

'array_map'是一個好主意= D –

+0

我試過了你的代碼和'print_r($ files)'但結果是空數組? – flowfree

+0

可能是因爲我出於某種原因用'g'拼寫了'attachchement'。再來一次? – Okonomiyaki3000

0

這裏你去: 下面的函數將幫助你簡化文件上傳的方式,你將能夠處理它,類似於文件的單個上傳,而不是多個文件上傳。

HTML:(form.html)

<form method="post" action="post.php" enctype="multipart/form-data"> 
<input type="file" name="attachment[]" /> 
<input type="file" name="attachment[]" /> 
<input type="file" name="attachment[]" /> 
<input type="submit" value="Upload" /> 

PHP:(post.php中)

<?php 
function simplifyMultiFileArray($files = array()) 
{ 
    $sFiles = array(); 
    if(is_array($files) && count($files) > 0) 
    { 
     foreach($files as $key => $file) 
     { 
      foreach($file as $index => $attr) 
      { 
       $sFiles[$index][$key] = $attr; 
      } 
     } 
    } 
    return $sFiles; 
} 

$sFiles = simplifyMultiFileArray($_FILES['attachment']); 
echo '<pre>'; 
print_r($sFiles); 
?> 
2

我,而做多的形式有同樣的問題。基本上我需要檢查是否有任何文件首先用'isset'上傳,然後遍歷每個文件並執行所有必要的條件。

的最快方式是隻選擇一個數組索引元素,如[「tmp_name的值」]和循環,用foreach:

if(isset($_FILES['attachments']) { 
    foreach($_FILES['attachments']['tmp_name'] as $key => $value) { 
     //do stuff you need/like 
    } 
} 

的主要原因用於多個文件上傳陣列,是在結束它更容易處理和迭代。如果您使用附件1,附件2等獨特名稱,則會遇到更復雜情況下的許多問題。例如,我有不同的附件類別的其他上傳字段。

如前所述,如果您發現整個陣列存在問題,那麼您可以採用一種方法將$_FILES數組修復爲更巧妙的形式。

0

有許多方法可以清理$ _FILES數組並使其更明智。這是我的首選方式:

foreach ($_FILES as $fieldname => $keys) 
{ 
    foreach ($keys as $key => $list) 
    { 
     foreach ($list as $no => $value) 
     { 
      $files[$fieldname][$no][$key] = $value; 
     } 
    } 
}