2010-08-05 59 views
0

問題:如何使用foreach獲取關鍵值?


嗨!我正在製作一個文件上傳表單,我可以上傳照片,我添加multiple=""inputname="upload_photo[]",這樣我就可以上傳多個文件。當我打印$_FILES['upload_photo']我得到這個,我想要 keyvalues

因此,例如我想得到只是[name]什麼將是egg.jpggreen.jpg

Array 
(
    [name] => Array 
     (
      [0] => egg.jpg 
      [1] => green.jpg 
     ) 

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

    [tmp_name] => Array 
     (
      [0] => C:\wamp\tmp\php50E9.tmp 
      [1] => C:\wamp\tmp\php50EA.tmp 
     ) 

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

    [size] => Array 
     (
      [0] => 24450 
      [1] => 65030 
     ) 

) 

這是我迄今


嘗試,但這個給了我一切,我不擁有控制權。

foreach($_FILES['upload_photo'] as $keys => $file){ 

    foreach($_FILES['upload_photo'][$keys] as $key => $files){ 
    echo $files . "<br />"; 
    } 
} 
+0

等等,什麼?我很困惑。;如果你似乎不想要多個,爲什麼你在''上加了'multiple =「」''? – 2010-08-05 19:59:58

+0

:D人,我剛剛顯示了一個版本,我只上傳了一個文件,好吧,我會編輯它:P – Adam 2010-08-05 20:01:40

+0

OMG! :)))...再次檢查出來,ahhh – Adam 2010-08-05 20:05:03

回答

1

認爲這是你想要做什麼,給這一個鏡頭:

foreach($_FILES['upload_photo'] as $photo) { 
    echo $photo['name']; 
} 

我不知道你的$_FILES陣列是怎麼構建這樣,它似乎自從我第一次回答以來,您改變了您的問題,因爲我的解決方案以您最初發布問題的方式工作。

所以對於$_FILES陣列結構,你將不得不使用嵌套循環,像這樣:

foreach($_FILES['upload_photo'] as $photo) { 
    foreach($photo['name'] as $name) { 
     echo $name; 
    } 
} 
+0

結果:'注意:未定義的索引:C:\ wamp \ www \中包含\ upload_photo.php的第7行x5,x5中的名稱,因爲有5個鍵。 – Adam 2010-08-05 20:05:38

+0

@CIRK查看更新的解決方案 – jordanstephens 2010-08-05 20:17:10

+0

我沒有改變我的問題,我只是將其改進得更易於理解:),我認爲這會起作用,我現在做了類似的事情,讓我試試看。 – Adam 2010-08-05 20:20:07

0

聽起來像$ _FILES是怪異。因此,要獲得的名稱,你想要的是簡單...

foreach($_FILES['upload_photo']['name'] AS $name) { 
    echo $name . "<br />"; 
} 

或者,根據我下面的評論,你可以做...

foreach($_FILES['upload_photo'] AS $key => $file) { 
    if ($key == 'name') { 
     foreach($file AS $name) { 
      echo $name . "<br />"; 
     } 
    } 
} 
+0

但後來我需要爲所有的鍵做一個foreach!你確定這是最好的方法嗎? :S – Adam 2010-08-05 20:10:11

+0

根據$ _FILES數組的設計方式,它看起來如此 - 您必須通過每個鍵才能獲取每個文件的信息,除非(像更明智的那樣)如果它被設計爲像$ _FILES [' upload_photo '] [0] [' 名稱「]'。唯一的另一種方式是,像foreach($ _FILES ['upload_photo'] AS $ key => $ file)''這樣一個單一的循環,然後在每次迭代中檢查是否存在$ key =「name」 。實際上,如果你將它與'switch'語句結合起來,可能不是一個壞的方法。 – Andrew 2010-08-05 20:12:48

+0

另外,在你的問題中,你指定了只需要'name',所以現在不要轉過身來說「但這只是我的名字!」 ;) – Andrew 2010-08-05 20:17:21

1

這是你以後在做什麼?

foreach($_FILES['upload_photo'] as $key => $value) 
{ 
    for ($i = 0; $i < count($_FILES['upload_photo'][$key]); $i++) 
    { 
     echo $_FILES['upload_photo'][$key][$i]; 
    } 

} 

不知道這是如何我想處理這種情況,但我認爲它會在你的情況下工作。

編輯:忘了數

EDIT2:如果你知道你的數組包含上面的示例中所示的鑰匙,從剛剛['name']陣列接收所有的值,你會做如下:

for ($i = 0; $i < count($_FILES['upload_photo']['name']); $i++) 
{ 
    $name = $_FILES['upload_photo']['name'][$i]; 
    //do something else 
} 

OR

foreach ($_FILES['upload_photo']['name'] as $value) 
{ 
    $name = $value; 
    //do something else 
} 

正如其他人已經表明 -

你似乎知道所涉及的數組鍵/它們是靜態的,所以唯一要做的就是計算出有多少個文件 - 統計數組中的項並多次循環。

1

也許這就是這個想法在$您給出的數據執行以下代碼_FILES將打印像

上傳1

名字的時候幫你 = ...

大小= ...


上傳2

名稱= ...

大小= ...

$numUploads = count($_FILES['upload_photo']['name']); 
for ($n = 0; $n < $numUploads; $n++) { 

    echo 'upload ' . $n . '<br/>'; 
    foreach ($_FILES['upload_photo'] as $prop => $values) { 

     echo $prop . ' = ' . $_FILES['upload_photo'][$prop][$n] . '<br/>'; 
    } 

    echo '<hr/>'; 
} 
+0

感謝您的回答,讓我試試吧 – Adam 2010-08-05 21:28:29

+0

嗯,我應該如何得到'name'或'tmp_name'?我需要爲它們指定一個變量 – Adam 2010-08-05 21:34:53

+0

刪除內部循環並執行類似 $ currentFileName = $ _FILES ['upload_photo'] ['name'] [$ n]; $ currentTempName = $ _FILES ['upload_photo'] ['tmp_name'] [$ n]; – 2010-08-05 23:02:03

1

如果你想要的是JUST上傳的文件的名字,那麼這將工作:

foreach($_FILES['upload_photo']['name'] as $idx => $name) { 
    echo "File #$idx: $name<br />" 
} 

如果你想處理每個上傳的文件,那麼你需要這樣的事情:

foreach(array_keys($_FILES['upload_photo']['name']) as $idx) { 
    move_uploaded_file($_FILES['upload_photo']['tmp_name'][$idx], '/some/where/on/your/server'); 
}