Как в multiselect-е выбрать в массив невыбранные пункты?

Статус
В этой теме нельзя размещать новые ответы.

verfaa

Профессор
Регистрация
29 Янв 2007
Сообщения
417
Реакции
49
Сорри, если туплю, есть мультиселект вида
Код:
<select id="countries" class="multiselect" multiple="multiple" name="ban_countrys[]">
 
<option value="AU">Австралия </option>
<option value="AT" selected>Австрия </option>
<option value="AZ">Азербайджан </option>
 
</select>

В нем список стран, юзер выбирает страны, которые нужно забанить.

После сабмита формы в скрипте обрабатываю полученную информацию:
Код:
$ban_countrys = $_POST['ban_countrys'];
        $ban_country_arr = '';
        if(count($ban_countrys) > 0){
            foreach($ban_countrys as $ban_country){
                if($ban_country == '')continue;
                $ban_country_arr[$ban_country] = 1;
                $ban_country_list .= '~'.$ban_country.'~';
            }
        }

В переменной $ban_country_list окажутся страны, которые юзер выбрал.
Вопрос в том, как в переменную $ban_country_list получить список стран, которые пользователь НЕ отметил, т.е. на момент сабмита формы они не имели аттрибут selected.
Спасибо.
 
Форма будет пересылать, только выбранные эллементы.
Логичный вариант, что в php скрипте у тебя есть массив всех стран и тогда при помощи array_diff ты можешь получить массив тех стран, что не выбрали.

Извращенный вариант в обработке select`a на JS и отправки его в скрытом поле...
 
Еще один извращенный вариант - в input hidden держать список стран (можно как на php сделать дубли значений option, так и на js написать функцию добавления input в зависимости от наличия options), при получении POST сравнивать что есть и что выбрано, хотя в php держать массив со странами более разумно, но все конечно зависит от конкретной ситуации.
 
Еще один извращенный вариант - в input hidden держать список стран (можно как на php сделать дубли значений option, так и на js написать функцию добавления input в зависимости от наличия options), при получении POST сравнивать что есть и что выбрано, хотя в php держать массив со странами более разумно, но все конечно зависит от конкретной ситуации.
Никогда не делайте этого на js + input hidden, причина в следующем: а) посетители могут передать все, что угодно, то есть придется опять проверять in_array ли? б) например, метод get передает строки до определенной длинны, как и некоторые браузеры (ие до 956 символов), то есть объемные данные будут к тому же и обрезаться.И еще: не забывайте, что входящие данные еще придется фильтровать от инъекций и xss.
А зачем этот танец с бубном? Вы хотите пользователям давать выбирать, или будете их принуждать?
Выберите, действительно, массив значений и найдите расхождение - array_diff, или схождение с массивом - array_intersect. Ведь все равно Вам нужно выбрать все страны, чтобы проверить, а не прислал ли Вам пользователь не существующих? (перед отправкой в базу данных, например, с целью SQL инъекции). И еще совет, все-таки будет удобнее сделать еще одну таблицу с индексами, в которую помещать, например: [идентификатор пользователя][user_id][int not null], [идентификатор страны под баном][ban_country_id][int not null], а дальше работаете с этой таблицей, при большом количестве посетителей выборки по такой таблице из двух целых параметров будут гораздо быстрее, и она займет гораздо меньше памяти при формировании списков, сортировке, поиске по определенному пользователю и т.п. Подумайте над этим.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху