首页 > 解决方案 > 是否可以循环 $request->hasFile() 函数而不获取重复数据?

问题描述

我需要将$request->hasFile()函数作为更新模块的一部分进行循环;

foreach ($answers as $a) {
    $ansid = 0;
    $ansid = $a['id'];
    $ans['quiz_content'] = $data['quiz_content_'.$a['id']];
    $ans['quiz_is_answer'] = 0;
    if ($data['radio-group8'] == "radio-group8_".$a['id']) {
        $ans['quiz_is_answer'] = 1;
    }
    if ($request->hasFile('quiz_img_'.$ansid) && $data['quiz_content_'.$ansid] == null && !empty($data['quiz_img_'.$ansid])) {
        $project_image = $request->file('quiz_img_'.$ansid);
        $filename = $ansid.'answer'.time().'.'.$project_image->getClientOriginalExtension();
        $destinationPath = public_path('/uploads/elearning/answers');
        $project_image->move($destinationPath, $filename);
        $ans['quiz_image_name'] = $filename;
        $ans['quiz_content_type'] = 2;
    } elseif ($request->hasFile('quiz_img_'.$ansid) && $data['quiz_content_'.$ansid] != null && !empty($data['quiz_img_'.$ansid])) {
        $project_image = $request->file('quiz_img_'.$ansid);
        $filename = $ansid.'answer'.time().'.'.$project_image->getClientOriginalExtension();
        $destinationPath = public_path('/uploads/elearning/answers');
        $project_image->move($destinationPath, $filename);
        $ans['quiz_content'] = $data['quiz_content_'.$ansid];
        $ans['quiz_image_name'] = $filename;
        $ans['quiz_content_type'] = 3;
    }

    QuizOption::where('id', $ansid)->update($ans);
}

但是,当我更新我的测验选项时,假设我有三个选项,a、b 和 c。如果我在 a、b 和 c 上设置图像,将获得相同的图像和相同的内容类型。如果我在 b 上设置图像,c 将获得与 b 相同的图像和内容类型。我知道问题出在if($request->hasFile())条件上。但是我该如何编码,以便每个选项 a、b 和 c 都有唯一的答案和图片?

标签: phplaravel

解决方案


您遇到的问题实际上与您$ans在循环中设置变量的方式有关,而不是与$request->hasFile()调用有关。因为您永远不会重置内部数据$ans- 仅设置某些索引 - 在未来循环中不匹配的条件期间的任何数据集都不会更改。

这是问题的简化示例(在 3v4l.org 上查看结果):

$data = array();

for ($i = 0; $i < 5; $i++) {
    $data['id'] = $i;

    if ($i === 2) {
        $data['foobar'] = $i;
    }

    var_dump($data);
}

if条件通过时$i = 2,它会foobar在数组上设置索引。未来的循环都不会更改该索引或重置$data数组。

我建议$ans = [];在循环的顶部放置或类似的重置,这样每个人都会获得仅与其答案相关的新数据。


推荐阅读