Почему то дублируется элементы

112
01 февраля 2021, 10:40

Есть 2 массива: $adminGenred, где хранатся жанры фильмов и $rowsG, где хранятся жанры у конкретного фильма.Я их хочу перебрать массив и сравнить если у этого фильма есть жанры боевик, то input должен быть checked, иначе простой инпут. Я написал

            foreach ($adminGenred as $genre) {
            $g = 0;
            echo '<div class="genre-name">';
            if (count($rowsG) != 0) {
                foreach ($rowsG as $rowG) {
                    $g++;
                    if ($genre['id'] == $rowG['id']) {
                        $g++;
                        echo '<input checked class="option-input checkbox" type="checkbox" name="genre[]" value="' . $genre['id'] . '">';
                        echo '<span class="text"> ' . $genre['genre'] . '</span>.';
                    } else {
                        if ($g <= 1) {
                            echo '<input class="option-input checkbox" type="checkbox" name="genre[]" value="' . $genre['id'] . '">';
                            echo '<span class="text"> ' . $genre['genre'] . '</span>.';
                        }
                    }
                }
            }
            echo '</div>';
        }

получилось вот это, если этот жанр есть в фильме то ставиться и checked и простой input

Пытался выцепить это дело как-то счетчиком, не получилось. Не могу понять данное поведение. В чем может быть проблема?

Answer 1

Вашу проблему можно решить например так:

foreach ($adminGenred as $genre) {
    echo '<div class="genre-name">';
    // вводим флажок        
    $isSelected = false;
    if (count($rowsG) != 0) {
        foreach ($rowsG as $rowG) {
            if ($genre['id'] == $rowG['id']) {
                echo '<input checked class="option-input checkbox" type="checkbox" name="genre[]" value="' . $genre['id'] . '">';
                echo '<span class="text"> ' . $genre['genre'] . '</span>.';
                // Отмечаем что данный жанр выбран
                $isSelected = true;
                // Выходим из цикла так как понятно что жанр выбран
                break;
            }
        }
    }
    // Флажок говорит что жанр НЕ выбран - нарисуем неотмеченный чекбокс
    if (!$isSelected) {
        echo '<input class="option-input checkbox" type="checkbox" name="genre[]" value="' . $genre['id'] . '">';
        echo '<span class="text"> ' . $genre['genre'] . '</span>.';
    }
    echo '</div>';
}

Также данный код можно упростить и выводить чекбокс только в одном месте с учетом флажка $isSelected.

Answer 2

Всё очень просто, у вас кривой алгоритм. Допустим ситуацию
1. У нас жанры: боевик, детектив. А у фильма жанр детектив, боевик.
2. Перебираем жанр => боевик. Фильм => детектив. Ставим не выбранный боевик
3. Перебираем жанр => боевик. Фильм => боевик. Ставим выбранный боевик

Второй цикл у вас должен только говорить выбрана позиция или нет (причём можно не перебирать дальше, если нашли совпадение). Первый цикл должен строить флажки

READ ALSO
Вывод объектов из базы в случайном порядке и без повтора

Вывод объектов из базы в случайном порядке и без повтора

Необходимо реализовать web приложение с голосованием используя springКандидаты загружаются в базу данных через специальную форму

96
Не работает метод onBackPressed Android

Не работает метод onBackPressed Android

Есть проект "написанный" в Buildbox и импортированный в Android StudioВ самой студии была создана Activity с кнопкой, при нажатии на которую открывается...

120