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

Тема в разделе "PHP", создана пользователем verfaa, 14 июн 2012.

Статус темы:
Закрыта.
Модераторы: latteo
  1. verfaa

    verfaa

    Регистр.:
    29 янв 2007
    Сообщения:
    375
    Симпатии:
    41
    Сорри, если туплю, есть мультиселект вида
    Код:
    <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.
    Спасибо.
     
  2. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.546
    Симпатии:
    1.418
    Форма будет пересылать, только выбранные эллементы.
    Логичный вариант, что в php скрипте у тебя есть массив всех стран и тогда при помощи array_diff ты можешь получить массив тех стран, что не выбрали.

    Извращенный вариант в обработке select`a на JS и отправки его в скрытом поле...
     
  3. zaxap83

    zaxap83 Постоялец

    Регистр.:
    6 дек 2010
    Сообщения:
    87
    Симпатии:
    28
    Еще один извращенный вариант - в input hidden держать список стран (можно как на php сделать дубли значений option, так и на js написать функцию добавления input в зависимости от наличия options), при получении POST сравнивать что есть и что выбрано, хотя в php держать массив со странами более разумно, но все конечно зависит от конкретной ситуации.
     
  4. Ruskai

    Ruskai

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