【问题标题】:Extract data into array from foreach从foreach中提取数据到数组中
【发布时间】:2014-11-05 20:08:17
【问题描述】:

请放轻松,这是我第一次,显然我不知道自己在做什么......

我正在使用我在网上找到的以下脚本来上传文件并将上传信息写入数据库,我想将 $file_name 信息收集到另一个数组中,以便在 implode 函数中在此代码块之外使用。我已经搜索了高低,但在我的搜索中没有成功。我想出了如何从 if 语句内部而不是在它和 php 块之外打印 $file_name(s),但我不知道如何将它变成一个数组。

任何帮助将不胜感激。

    <?php
if(isset($_FILES['files'])){
    $errors= array();
    foreach($_FILES['files']['tmp_name'] as $key => $tmp_name ){
        $file_name = $key.$_FILES['files']['name'][$key];
        $file_size =$_FILES['files']['size'][$key];
        $file_tmp =$_FILES['files']['tmp_name'][$key];
        $file_type=$_FILES['files']['type'][$key];
        $timestamp= date('Y-m-d G:i:s');
        if($file_size > 2097152){
            $errors[]='File size must be less than 2 MB';
        }       
        $query="INSERT into upload_data (FILE_NAME, FILE_SIZE, FILE_TYPE, timestamp) VALUES(:file_name,:file_size,:file_type, :timestamp)";
        $desired_dir="files";
        if(empty($errors)==true){
            if(is_dir($desired_dir)==false){
                mkdir("$desired_dir", 0700);        // Create directory if it does not exist
            }
            if(is_dir("$desired_dir/".$file_name)==false){
                move_uploaded_file($file_tmp,"files/".$file_name);
            }else{                                  //rename the file if another one exist
                $new_dir="files/".$file_name.time();
                 rename($file_tmp,$new_dir) ;               
            }
            $q = $dbo->prepare($query);     
            $q->execute(array(':file_name'=>$file_name,':file_size'=>$file_size,':file_type'=>$file_type, ':timestamp'=>$timestamp));

        }else{
                print_r($errors);
        }
    }
    if(empty($error)){
        echo "Success";
    }
}

?>

【问题讨论】:

  • 如果我理解正确,请尝试在 foreach 循环之前创建一个空数组,您可以在循环内填充该数组,然后稍后从中读取
  • 您只想将这些文件名放在数组之外。我说的对吗?
  • Tushar - 是的,没错,我有第二个 PHP 块,我想使用其中的数据。

标签: php arrays pdo foreach


【解决方案1】:

在循环之前设置一个数组:

$file_name_array = array();

将以下代码放在 $file_name 之后的行中。

$file_name_array[] = $file_name;

这将为您提供一个包含 $file_name 内容的数组,并将在每次传递时添加到数组中。

然后你可以对数组做任何你想做的事情。

【讨论】:

    【解决方案2】:

    声明一个数组:

    $file_names();
    

    $file_name之后的循环内添加这一行:

    $file_names[] = $file_name;
    

    $file_names 将为您提供所有文件的名称。

    【讨论】:

      【解决方案3】:

      为了你的理解(正如你所说的你是新人)

      在 PHP 中 可以使用array() 语言结构创建数组。它接受任意数量的逗号分隔的key =&gt; value 对作为参数。

      Example #1 A simple array
      
      <?php
      $array = array(
          "foo" => "bar",
          "bar" => "foo",
      );
      
      // as of PHP 5.4
      $array = [
          "foo" => "bar",
          "bar" => "foo",
      ];
      
      ?>
      

      现在,您只需将所有从 foreach 循环中截取的数据放入一个新数组中:

       <?php
      if(isset($_FILES['files'])){
          $errors= array();
          $filename_array = array();
          foreach($_FILES['files']['tmp_name'] as $key => $tmp_name ){
              $file_name = $key.$_FILES['files']['name'][$key];
              $filename_array[] = $file_name;
                $file_size =$_FILES['files']['size'][$key];
          $file_tmp =$_FILES['files']['tmp_name'][$key];
          $file_type=$_FILES['files']['type'][$key];
          $timestamp= date('Y-m-d G:i:s');
          if($file_size > 2097152){
              $errors[]='File size must be less than 2 MB';
          }       
          $query="INSERT into upload_data (FILE_NAME, FILE_SIZE, FILE_TYPE, timestamp) VALUES(:file_name,:file_size,:file_type, :timestamp)";
          $desired_dir="files";
          if(empty($errors)==true){
              if(is_dir($desired_dir)==false){
                  mkdir("$desired_dir", 0700);        // Create directory if it does not exist
              }
              if(is_dir("$desired_dir/".$file_name)==false){
                  move_uploaded_file($file_tmp,"files/".$file_name);
              }else{                                  //rename the file if another one exist
                  $new_dir="files/".$file_name.time();
                   rename($file_tmp,$new_dir) ;               
              }
              $q = $dbo->prepare($query);     
              $q->execute(array(':file_name'=>$file_name,':file_size'=>$file_size,':file_type'=>$file_type, ':timestamp'=>$timestamp));
      
          }else{
                  print_r($errors);
          }
      }
      if(empty($error)){
          echo "Success";
      }
      }
      
      ?>
      

      现在在你的第二个块中获取文件名

      foreach ($filename_array as $filename) {
          echo $filename;
      }
      

      了解请参考PHP Arrays

      【讨论】:

      • Tushar 这很好用,谢谢。我将如何处理文件名信息的内爆?我的 implode 出现无效参数错误。
      • 你想如何内爆......你能用一个例子更新你的完整问题......这会有所帮助,谢谢
      • 我尝试了以下变体: foreach ($filename_array as $filename) { $xxx= implode($_POST['filename'], ", ");回声$文件名;回声 $xxx; }
      • 你为什么使用 $_POST
      • 作为新手,我认为我必须这样做,但我试过了,效果很好,再次感谢您!
      猜你喜欢
      • 2016-03-11
      • 1970-01-01
      • 2011-08-09
      • 1970-01-01
      • 2016-02-14
      • 1970-01-01
      • 2020-10-18
      • 2012-06-13
      • 2014-07-05
      相关资源
      最近更新 更多