Доброго времени суток! Существуют две проблемы. Первая: В обработчик $_POST запросом приходит массив из формы и сравнивается с шаблоном, дабы юзверь через код в браузере не отправил то, чего ему хочется Пример формы: HTML: <form method="POST"> <select name="arrForm[]"> <option>Строка_1</option> <option>Строка_2</option> <option>Строка_3</option> <option>Строка_4</option> <option>Строка_5</option> </select> <!-- тут кнопки на jqery + добавить select или - удалить. Максимум 10 select-ов --> <select name="arrForm[]"> <option>Строка_1</option> <option>Строка_2</option> <option>Строка_3</option> <option>Строка_4</option> <option>Строка_5</option> </select> <button>Отправить</button> </form> Пример обработчика: PHP: <?php if (isset($_POST['arrForm'])) { $arrTemplate = array("Строка_1", "Строка_2", "Строка_3", "Строка_4", "Строка_5"); foreach($_POST['arrForm'] as $k=>$m) { if (!empty($m)) { $arrForm[$k] = $m; } } $arr_result = array_intersect($arrTemplate, $arrForm);// делаем схождение массивов $arr_result = implode(", ", $arr_result); $link->query("Запись в БД"); } ?> Проблема в том, что юзер имеет право поставить 2 и более select с одинаковыми строками (Строка_1, Строка_1, Строка_1 и т.д.) но array_intersect сравнивая с шаблоном, отбросит все строки одинаковые и оставит только одну. Мне нужно, чтобы сколько юзер выбрал одноименных строк - столько и занеслось в бд. Как мне решить эту проблему? Дописать в шаблон "Строка_1" десять раз?) И вторая проблема (кода нет ибо даже с чего начать не знаю) - после сравнения массивов, мне нужно как то считывать их содержимое, и если в массиве есть "Строка_1" то установить переменную и присвоить ей значение, скажем 100. Если в массиве 2 одноименных строки, то так же и для второй или сложить эти значения. Если есть "Строка_2", то установить переменную со значением 250, например.. Каким образом я могу это реализовать, есть мысли на этот счет?
Вместо array_intersect() используйте in_array() Код (Text): <select name="select1"> <option value="a"> a <option value="b"> b </select>
Пустоту показывает.. Ничего не получаю. Ну и как в мануале в примерах показано ставил условие if то успешной проверки не получал, даже если я эти массивы местами поменяю. Или один массив в точ точ должен соответствовать с тем с которым сверка идет? Если да, то это не вариант.. Я чего-то недопонимаю. PHP: $arr_result = in_array($arrTemplate, $arrForm); print_r($arr_result ); В коде страницы ты можешь value изменить на любое.. И отправится в обработчик не value = 100 в Строка_1, а 0 или что он там напишет..
Код (Text): <?php $goodvalues = array('1','2','3','4','5','6','7','8','9','other'); $arrForm = array ('one','two','4','nine', 'other'); //получено из формы foreach($arrForm as $value) { if(in_array($value, $goodvalues)) { $new_array[] = $value; } } echo '<pre>'; print_r($new_array); ?>
Я в первом посте не дописал немного HTML: <select name="arrForm[]"> <option value="100">Строка_1</option> <option value="100">Строка_2</option> <option value="170">Строка_3</option> <option value="150">Строка_4</option> <option value="320">Строка_5</option> </select> value на стороне клиента используется для подсчета суммы при помощи js Так же при помощи js я отправляю в обработчик содержимое option. Я могу так же взять и отправить сумму post запросом в скрипт и записать её в бд, но ведь юзер в браузере, в коде, может поставить любое значение value и в итоге в бд запишется не та сумма, которая должна. Поэтому могу ли я считывать содержимое массива $new_array ( с которым Вы мне помогли) и формировать следующее: Если в массиве есть "Строка_1", то переменной присваивается значение 100. Если такая строка встречается дважды, то значение увеличивается, т.е. будет 200. Если "Строка_3", то назначается вторая переменная равная 170. По итогу все переменные складываются. Вроде как можно так же использовать in_array и искать таким образом каждую строку по отдельности, но будет ли это верным решением? PHP: if(in_array('Строка_1', $new_array)) { $a = 100; } if(in_array('Строка_3', $new_array)) { $b = 170; } $sum = $a + $b; пока ничего умнее не придумал..
Форма написанная в таком стиле отправит содержимое параметра value, например 170, а не "Строка_3". Причем только в одном экземпляре., если нужен множественный выбор используйте параметр multiple. HTML: <select multiple name="arrForm[]" size="5"> <option value="100">Строка_1</option> <option value="100">Строка_2</option> <option value="170">Строка_3</option> <option value="150">Строка_4</option> <option value="320">Строка_5</option> </select> Обработчик будет примерно таким: PHP: <?php //$goodvalues = array('1','2','3','4','5','6','7','8','9','other'); $goodvalues = array('100','150','170','320'); //$arrForm = array ('one','two','4','nine', 'other'); //получено из формы $arrForm = array ('100','100','170','150','320'); $sum = 0; foreach($arrForm as $value) { if(in_array($value, $goodvalues)) { // $new_array[] = $value; $sum += $value; } } echo '<pre>'; //print_r($new_array); echo 'sum: '.$sum; ?>
Я знаю. Поэтому код: Код (Text): $(document).ready(function() { $("#submit").click(function() { $("select[name='arrForm[]'] > option").each(function() { var content = $(this).text(); $(this).val(content); }); }); }); В этом случае в post уходит не value, а как раз таки текст из option. multiple тоже не подходит, всё это не важно. Мне важно то, что описал выше. Как в зависимости от содержимого массива присвоить значение переменной.
PHP: <?php //$goodvalues = array('1','2','3','4','5','6','7','8','9','other'); //$goodvalues = array('100','150','170','320'); $goodvalues = array ('Строка_1','Строка_2','Строка_3','Строка_4','Строка_5'); //$arrForm = array ('one','two','4','nine', 'other'); //получено из формы $arrForm = array ('Строка_2','Строка_3','Строка_4','Строка_5'); $repl = array( 'Строка_1' => 100, 'Строка_2' => 100, 'Строка_3' => 170, 'Строка_4' => 150, 'Строка_5' => 320); $sum = 0; foreach($arrForm as $value) { if(in_array($value, $goodvalues)) { // $new_array[] = $value; // $sum += $value; $sum += $repl[$value]; } } echo '<pre>'; //print_r($new_array); echo 'sum: '.$sum; ?>