【问题标题】:How to make two foreach have the same variable?如何使两个 foreach 具有相同的变量?
【发布时间】:2018-01-10 10:20:00
【问题描述】:

我有一个上传多个文件的功能。我使用两个 foreach 来上传文件。在第一个 foreach 中,我循环上传的文件,

$j_upl      = count($my_upload["name"]);
$isUploaded = 0;
$files      = $_FILES;

for($i=0;$i<$j_upl;$i++){

    $random_name             = substr($my_upload["name"][$i],0,-4)."_".date("ymdhis").$i.substr($my_upload["name"][$i],-4);
    $this->load->library('upload', $config);

    $_FILES['upload_act']['name']       = $files['upload_act']['name'][$i];
    $_FILES['upload_act']['type']       = $files['upload_act']['type'][$i];
    $_FILES['upload_act']['tmp_name']   = $files['upload_act']['tmp_name'][$i];
    $_FILES['upload_act']['error']      = $files['upload_act']['error'][$i];
    $_FILES['upload_act']['size']       = $files['upload_act']['size'][$i];

    $this->upload->initialize($config);


    $this->upload->do_upload('upload_act');

}

$random_name 中,我使用.date("ymdhis") 添加到file_name。因此,该文件将重命名为the file name."_".datetime uploded

在第二个 foreach 中,我使用它来将 $random_name 插入到数据库中。

foreach($details as $rows){             

    $file_name    = substr($rows['val_upl'],0,-4)."_".date("ymdhis").$ii.substr($rows['val_upl'],-4);               

    $dt_act['UPL_FILENAME']     = ($rows['val_upl'] == "") ? NULL : $file_name.$ii;             

    $this->MProject->ins_activity_m($dt_act);
    $ii += 1;
}

我使用相同的方法获取$file_name。如果我上传大约 2-3 个文件,$file_name$random_name 匹配。但是,如果有更多文件要上传,它开始与$random_name 不匹配,因为('Ymdhis') 中的第二个不同。

$random_name 匹配$random_name 以便插入的文件名与上传的文件名匹配的最佳方法是什么?

注意:

  • 我可能会在文件名中添加一些内容,但我不想删除任何内容(日期时间格式应该存在)

【问题讨论】:

  • 上传日期的确切秒数是否重要。为什么不将date() 与您的变量一起移出循环并将其分配给一个变量并将其传递给两个循环?您仍然可以获得代码开始处理批处理而不是单独处理的确切时间。
  • @MatthewBrent 是的,我也需要秒数用于其他目的。
  • 为什么不在循环之前生成$random,您可以将其附加到所有上传文件名?而不是依赖date()?
  • @giollianosulit 我需要文件名中的日期时间。
  • 好吧,然后把date("ymdhis") 存为变量,循环之前并连接进去?

标签: php codeigniter loops foreach


【解决方案1】:

解决此问题的最简单方法是在第一个 for 循环中创建一个关联数组,并将所需信息作为键值对传入。您不需要遍历此对象,因为您可以使用您已经知道循环中的值的键(例如现有文件名)来访问如下值...

$file_uploads = array();

for($i=0;$i<$j_upl;$i++){

$random_name = substr($my_upload["name"][$i],0,-4)."_".date("ymdhis").$i.substr($my_upload["name"][$i],-4);

$file_uploads[$my_upload["name"][$i]] = array(
    'new_name' => $random_name,
    'some_other_value' => $some_other_var
);

$this->load->library('upload', $config);

$_FILES['upload_act']['name']       = $files['upload_act']['name'][$i];
$_FILES['upload_act']['type']       = $files['upload_act']['type'][$i];
$_FILES['upload_act']['tmp_name']   = $files['upload_act']['tmp_name'][$i];
$_FILES['upload_act']['error']      = $files['upload_act']['error'][$i];
$_FILES['upload_act']['size']       = $files['upload_act']['size'][$i];

$this->upload->initialize($config);


$this->upload->do_upload('upload_act');

}


foreach($details as $rows){             

$file_name = $file_uploads[substr($rows['val_upl']]['new_name'];               

$dt_act['UPL_FILENAME']     = ($rows['val_upl'] == "") ? NULL : $file_name.$ii;             

$this->MProject->ins_activity_m($dt_act);
$ii += 1;
}

请注意我没有测试过这个,我在这里是盲编码,但这应该足以让你到达那里。

【讨论】:

  • previousCode.date('ymdhis') 是什么?
  • 它只是伪代码...用你所有的代码替换 previousCode
  • 哦,好吧。我试试看。
  • 试试我更新的代码......正如我在答案中所说的,我没有测试过它,但你应该更清楚地遵循
  • 这对 Vahn 有帮助吗?如果有,请接受答案。
【解决方案2】:

如果您需要从第一个循环中捕获确切的文件名,为什么不在第一个循环中构建一个仅存储文件名的数组呢?然后,您可以通过 $rows 的值引用数组,而不是尝试重建名称。 (这也取决于这两个循环之间的内容。)

【讨论】:

  • 如何在第二个foreach中循环数组?
  • 见下文 Vahn ...这只是伪代码,但如果您需要,我可以澄清一下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-21
  • 1970-01-01
  • 2021-03-22
相关资源
最近更新 更多