PHP: анализирует данные $ _FILES [] в многомерном массиве - PullRequest
1 голос
/ 23 декабря 2010

У меня есть форма, которая позволяет динамическое дублирование полей формы. Форма позволяет загружать файлы и вводить текст, поэтому данные отправляются в массивах $ _POST и $ _FILES.

Начальный набор входов выглядит следующим образом:

<input type="text" name="question[1][text]"  />
<input  type="file" name="question[1][file]"  /> 

<input type="text" class="a" name="answer[1][text][]"  /> 
<input  type="file" name="answer[1][file][]"  /> 

Когда дублирующиеся поля увеличиваются, они выглядят так:

<input type="text" name="question[2][text]"  />
<input  type="file" name="question[2][file]"  /> 

<input type="text" class="a" name="answer[2][text][]"  /> 
<input  type="file" name="answer[2][file][]"  /> 

Чтобы усложнить ситуацию, поля формы «ответ» также могут дублироваться (таким образом, [] в конце массива имен «ответ».

Как мне проанализировать опубликованный массив $ _FILES? Я пробовал что-то вроде этого:

foreach ($_FILES['question'] as $p_num)
{ 
  echo  $p_num['file']['name'];

    foreach ($_FILES['answer'] as $a_num)
    { 
      echo  $a_num['file']['name'];
    }

}

но я получаю ошибку "Неопределенный индекс: файл ...". Как я могу разобрать опубликованные значения.

Ответы [ 3 ]

3 голосов
/ 29 декабря 2010

обновлен

Форма:

<form method="post" enctype="multipart/form-data">
<input type="text" name="question[1][text]"  value="AAA"/>
<input type="file" name="question[1][file]"  />
<input type="text" name="answer[1][text][0]" value="bbb" />
<input type="file" name="answer[1][file][0]"  />
<input type="text" name="answer[1][text][1]" value="ccc" />
<input type="file" name="answer[1][file][1]"  />
<input type="submit"/>

PHP:

$rtn = array();
foreach ($_POST['question'] as $key=>$arr)
{
  if (!isset($rtn[$key])) 
  {
    $rtn[$key] = array('question'=>'', 'answer'=>array());
  }
  $rtn[$key]['question'] = $arr['text'];


  $tmp = array();
  foreach ($_FILES['question'] as $fkey=>$farr)
  {
    $tmp[$fkey] = $farr[$key]['file'];
  }
  $rtn[$key]['question_file']  = $tmp;

  $rtn[$key]['answer']['text'] = $_POST['answer'][$key]['text'];
}

foreach ($_FILES['answer'] as $key=>$arr)
{
  foreach ($arr as $answer_idx=>$farr)
  {
    foreach ($farr as $file_index=>$file)
    {
      $rtn[$answer_idx]['answer_file'][$file_index][$key] = $file;
    }
  }
}

вывод (загрузка с использованием test.txt)

Array
(
    [1] => Array
        (
            [question] => AAA
            [answer] => Array
                (
                    [text] => Array
                        (
                            [0] => bbb
                            [1] => ccc
                        )

                )

            [question_file] => Array
                (
                    [name] => test.txt
                    [type] => text/plain
                    [tmp_name] => /tmp/phpqef5eL
                    [error] => 0
                    [size] => 0
                )

            [answer_file] => Array
                (
                    [file] => Array
                        (
                            [name] => Array
                                (
                                    [0] => test.txt
                                    [1] => test.txt
                                )

                            [type] => Array
                                (
                                    [0] => text/plain
                                    [1] => text/plain
                                )

                            [tmp_name] => Array
                                (
                                    [0] => /tmp/phpc2sdMs
                                    [1] => /tmp/phpzKNnja
                                )

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

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

                        )

                )

        )

)
2 голосов
/ 29 декабря 2010

PHP не нравится, когда вы загружаете файлы с именами файлов, указанными в формате многомерного массива.Учитывая, что данные POST и FILE хранятся в PHP полностью раздельно, вам следует перенастроить форму.Формат «question [1]» в порядке, но не «question [1] [file]».Вместо этого попробуйте что-то вроде:

<input type="text" name="question[1][text]"  />
<input  type="file" name="file[1]"  /> 

<input type="text" name="question[2][text]"  />
<input  type="file" name="file[2]"  /> 

Пока вы сохраняете одинаковое значение индекса для полей файла и всех других полей, можете обращаться к файлам во время обработки формы следующим образом:

foreach(array_keys($_POST['question']) as $key {
     $file_is = $_FILES['file'][$key]['tmp_name'];
     $question_text = $_POST['question][$key]['text'];
}
0 голосов
/ 27 апреля 2011

PHP «переупорядочивает» массив $ _FILES нежелательным образом.Если вы обратитесь к руководству по PHP, на странице, посвященной нескольким загрузкам файлов:

http://www.php.net/manual/en/features.file-upload.multiple.php

В комментариях на странице вы найдете большое количество фрагментов кода, связанных с этим раздражением.На самом деле большинство комментариев об этом!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...