4

これはばかげた質問かもしれませんが、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 
        ) 
    ) 
)
4

9 に答える 9

12

うわー、それは確かに奇妙<input type="file" name="attachments[]" />です。マークアップで使用していますか? unique を使用してそれらを変更する余裕があれば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
}
于 2012-05-28T06:15:47.193 に答える
5

この構造はナンセンスだとずっと思っていました。したがって、複数入力ファイル フィールドを使用するときは常に、次のようにします。

$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,
    );
}

次に、反復可能な配列が得られ、その中の各項目は、通常の単一ファイル入力で得られるのと同じ構造の連想配列になります。したがって、それらを処理するための関数が既にある場合は、これらの各項目をそれに渡すだけでよく、変更は必要ありません。

ちなみに、すべての入力を配列としてキャストする理由は[]、ファイル入力の名前に を付けるのを忘れた場合でもこれが機能するようにするためです (もちろん、その場合は 1 つのファイルしか取得できませんが、壊れるよりはましです)。 )。

于 2012-05-28T06:31:55.300 に答える
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;
}
于 2012-05-28T06:15:48.667 に答える
3

これが $_FILES を繰り返す唯一の方法です。

foreach ($_FILES['attachments']['tmp_name'] as $k => $v) {
  echo $_FILES['attachments']['name'][$k];
  echo $_FILES['attachments']['type'][$k];
}
于 2012-05-28T06:16:01.097 に答える
2

マルチパートフォームを実行しているときに同じ問題が発生しました。基本的に、最初に「isset」を使用してファイルのアップロードがあるかどうかを確認してから、すべてのファイルを調べて、必要なすべての条件を実行する必要がありました。

最も速い方法は、['tmp_name']のような1つの配列インデックス要素を選択し、それをforeachでループすることです。

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

複数のファイルのアップロードに配列を使用する主な理由は、最終的には処理と反復がはるかに簡単になるためです。添付ファイル1、添付ファイル2のような一意の名前を使用すると、より複雑な状況で多くの問題が発生します。たとえば、添付ファイルのカテゴリごとに他のアップロードフィールドがありました。

もちろん、前述のように、$_FILES配列全体に問題がある場合は、配列をより巧妙な形式に修正する方法を実行できます。

于 2012-11-08T14:48:10.847 に答える
2

こちらです?

foreach((array)$_FILES["attachments"] as $val) {
   foreach((array)$val["name"] as $name) {
      // $name = "test1.png",...
   }
   foreach((array)$val["type"] as $type) {
      // $type = "imagepng",...
   }   
}
于 2012-05-28T06:19:29.753 に答える
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
                )

        )

)
于 2012-05-28T06:22:47.303 に答える
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);
?>
于 2012-05-28T06:33:49.833 に答える