2010-08-05 62 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'); 
}