【问题标题】:PHP Multiple Input Text and Input File ArrayPHP 多输入文本和输入文件数组
【发布时间】:2019-08-03 05:36:03
【问题描述】:

我有以下代码多个文本和类型文件使用数组上传文件和文本。

在这段代码中,如果我删除类型文件,这段代码就可以工作。但使用后文件不起作用

这是表格

<form method="post" enctype="multipart/form-data">   
  <?php 
  $data_array = array('text','text2','file','file2');
  foreach($data_array as $data_name){ ?>
  <input type="hidden" name="data_name[]" value="<?php echo $data_name; ?>">
  <?php if(strpos($data_name,'text') !== false){ ?>
  <input name="data_value[]" type="text" /> 
  <?php }
  if(strpos($data_name,'file') !== false){ ?>
   <input name="data_value[]" type="file" /> <?php }
  } ?>
  <input type="submit" name="submit" value="Add" />
</form>

这是 PHP 代码,我认为$_FILE 部分有更多改进

    if(isset($_POST['submit'])){ 
    if(isset($_FILES['data_name'])){
        foreach(array_combine($_FILES['data_name'],$_POST['data_value']) as $dataname => $datavalue){
            $file_name = $_FILES['data_name']['name']; 
            echo file_name;  
        }
    }
    if(isset($_POST['data_name'])){
        foreach(array_combine($_POST['data_name'],$_POST['data_value']) as $dataname => $datavalue){
            echo $dataname.' - '.$datavalue;
        }
    }
}

这是文件的错误..

Warning: array_combine(): Both parameters should have an equal number
of elements in pagename.php on line 25

Warning: Invalid argument supplied for foreach() in pagename.php on line 25

我需要这样的输出 -

 text = value
 text2 = value2
 file = file.jpg 
 file2  = file2.jpg 

【问题讨论】:

    标签: php arrays loops multidimensional-array foreach


    【解决方案1】:

    正如错误消息中明确指出的那样,$_FILES['data_name']$_POST['data_value' 的大小不同。 (而且我很确定 foreach 失败了,因为 array_combine 失败了)。

    这是你在这里解释的:“如果我删除类型文件,这个代码就可以工作。但是使用文件之后就不行了”。

    如果你想使用array_combine(),数组的大小必须相同。 如果添加过滤器(例如if(strpos($data_name,'file') !== false)),则存在数组不匹配的可能性(如该问题所示)。

    一种方法是过滤掉与“data_value[]”输入条件相同的“data_name[]”输入。

    或者反过来:在上面提到的if 上添加一个else,它会产生&lt;input name="data_value[]" type="hidden" /&gt;(注意类型)。这将确保数组的大小相同。您必须弄清楚如何处理 php 代码中的这些“虚拟”输入。也许给他们一个可以测试的值(如value="dummy")。

    【讨论】:

    • 你能用代码解释一下吗
    【解决方案2】:

    用这个替换你的 php 代码:

    function get_names_for_entity($name, $arr)
    {
      if (!empty($arr)) {
        $ret = array_values(
          array_filter(
            $arr,
            function ($itm) use ($name) {
              return strpos($itm, $name) !== false;
            }
          )
        );
      } else {
        $ret = [];
      }
      return $ret;
    }
    
    $names_a = [
      'file' => get_names_for_entity('file', $_POST['data_name']),
      'text' => get_names_for_entity('text', $_POST['data_name'])
    ];
    if (isset($_POST['submit'])) {
      if (isset($_POST['data_value'])) {
          foreach ($_POST['data_value'] as $dataname_idx => $datavalue) {
              echo $names_a['text'][$dataname_idx].' - '.$datavalue;
          }
      }
    
      if (isset($_FILES['data_value'])) {
          foreach ($_FILES['data_value']['name'] as $dataname_idx => $datavalue) {
              $file_name = $_FILES['data_value']['name'][$dataname_idx];
              echo $names_a['file'][$dataname_idx].' - '.$file_name;
          }
      }
    }
    

    【讨论】:

    • 我如何找到类型文件数据_NAME
    • @sanjayjoon $_FILES['data_value']['type'][$dataname_idx]。见Manual
    • No Dear You Not UnderStaend I Need '' 文件值.. .
    • 请再次提问
    • 如果我像这样$data_array = array('text','file','text2','file2'); 更改数组中的序列值。然后导致不序列文本数据进入文件数据和文件数据进入文本数据。
    猜你喜欢
    • 2019-08-09
    • 1970-01-01
    • 2011-08-30
    • 2014-03-20
    • 1970-01-01
    • 2010-12-31
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    相关资源
    最近更新 更多