Можно ли зациклить функцию $request-> HasFile() и не получать повторяющиеся данные?

#php #laravel

#php #ларавель

Вопрос:

Мне нужно зациклить $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) amp;amp; $data['quiz_content_'.$ansid] == null amp;amp; !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) amp;amp; $data['quiz_content_'.$ansid] != null amp;amp; !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, имел уникальный ответ и картинку?

Комментарии:

1. Я думаю, что ваша проблема может быть в первых двух строках в цикле foreach. Чего вы действительно хотите: $ansid = 0; (чтобы быть целым числом) или $ansid = $a [‘id’]; быть чем-то из $answers? Кстати. пожалуйста, покажите нам несколько примеров, что находится в пределах $answers.

2. привет, @PowerStat . в принципе, я думал, что проблема в том, что идентификатор не сбрасывается, поэтому $ansid = 0; в начале. но, добавив $ans =[]; теперь это работает просто отлично.

Ответ №1:

Проблема, с которой вы столкнулись, на самом деле связана с тем, как вы устанавливаете $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 условие проходит when $i = 2 , оно устанавливает foobar индекс в массиве. Ни один из будущих циклов не изменяет этот индекс или не сбрасывает $data массив.

Я бы предложил поместить $ans = []; или аналогичный сброс в начало вашего цикла, чтобы каждый получал свежие данные, относящиеся только к его ответу.

Комментарии:

1. так что лучше использовать цикл for вместо цикла foreach в laravel? Я попробую это. спасибо, приятель!

2. Я просто использовал for в качестве примера, чтобы показать вам, как установка переменной в цикле влияет на ваш код. У foreach вас все в порядке. Пожалуйста, прочтите последнее предложение.

3. ах, мой плохой, неправильно понял это. итак, в основном, прежде чем я сохраню параметры, я должен сначала поместить значения в новый массив, да?

4. это работает! сброс массива вверху, как вы сказали, очищает и дает мне свежие данные при каждой вставке. Я боролся с этим в течение 2 дней, и простая строка кода буквально решила это. большое спасибо, приятель!