За последние 24 часа нас посетили 22287 программистов и 1031 робот. Сейчас ищут 649 программистов ...

Схождение массивов, установить переменную в зависимости от содержимого значения в массиве

Тема в разделе "PHP для новичков", создана пользователем Cyusik, 26 авг 2020.

  1. Cyusik

    Cyusik Новичок

    С нами с:
    12 апр 2020
    Сообщения:
    12
    Симпатии:
    0
    Доброго времени суток! Существуют две проблемы.
    Первая: В обработчик $_POST запросом приходит массив из формы и сравнивается с шаблоном, дабы юзверь через код в браузере не отправил то, чего ему хочется
    Пример формы:
    HTML:
    1.  
    2. <form method="POST">
    3.    <select name="arrForm[]">
    4.       <option>Строка_1</option>
    5.       <option>Строка_2</option>
    6.       <option>Строка_3</option>
    7.       <option>Строка_4</option>
    8.       <option>Строка_5</option>
    9.    </select>
    10.    <!-- тут кнопки на jqery + добавить select или - удалить. Максимум 10 select-ов -->
    11.    <select name="arrForm[]">
    12.       <option>Строка_1</option>
    13.       <option>Строка_2</option>
    14.       <option>Строка_3</option>
    15.       <option>Строка_4</option>
    16.       <option>Строка_5</option>
    17.    </select>
    18.    <button>Отправить</button>
    19. </form>
    20.  
    Пример обработчика:
    PHP:
    1. <?php
    2. if (isset($_POST['arrForm'])) {
    3.    $arrTemplate = array("Строка_1", "Строка_2", "Строка_3", "Строка_4", "Строка_5");
    4.  
    5.    foreach($_POST['arrForm'] as $k=>$m) {
    6.       if (!empty($m)) {
    7.          $arrForm[$k] = $m;
    8.       }
    9.    }
    10.    $arr_result = array_intersect($arrTemplate, $arrForm);// делаем схождение массивов
    11.    $arr_result = implode(", ", $arr_result);
    12.    $link->query("Запись в БД");
    13.  
    14. }
    15. ?>
    Проблема в том, что юзер имеет право поставить 2 и более select с одинаковыми строками (Строка_1, Строка_1, Строка_1 и т.д.) но array_intersect сравнивая с шаблоном, отбросит все строки одинаковые и оставит только одну. Мне нужно, чтобы сколько юзер выбрал одноименных строк - столько и занеслось в бд. Как мне решить эту проблему? Дописать в шаблон "Строка_1" десять раз?)

    И вторая проблема (кода нет ибо даже с чего начать не знаю) - после сравнения массивов, мне нужно как то считывать их содержимое, и если в массиве есть "Строка_1" то установить переменную и присвоить ей значение, скажем 100. Если в массиве 2 одноименных строки, то так же и для второй или сложить эти значения. Если есть "Строка_2", то установить переменную со значением 250, например.. Каким образом я могу это реализовать, есть мысли на этот счет?
     
  2. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Вместо array_intersect() используйте in_array()
    Код (Text):
    1. <select name="select1">
    2.   <option value="a">  a
    3.   <option value="b">  b
    4. </select>
     
  3. Cyusik

    Cyusik Новичок

    С нами с:
    12 апр 2020
    Сообщения:
    12
    Симпатии:
    0
    Пустоту показывает.. Ничего не получаю. Ну и как в мануале в примерах показано ставил условие if то успешной проверки не получал, даже если я эти массивы местами поменяю. Или один массив в точ точ должен соответствовать с тем с которым сверка идет? Если да, то это не вариант..
    Я чего-то недопонимаю.
    PHP:
    1. $arr_result = in_array($arrTemplate, $arrForm);
    2. print_r($arr_result );
    В коде страницы ты можешь value изменить на любое.. И отправится в обработчик не value = 100 в Строка_1, а 0 или что он там напишет..
     
  4. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Код (Text):
    1. <?php
    2. $goodvalues = array('1','2','3','4','5','6','7','8','9','other');
    3.  
    4. $arrForm = array ('one','two','4','nine', 'other'); //получено из формы
    5.  
    6. foreach($arrForm as $value)
    7. {
    8. if(in_array($value, $goodvalues))
    9. {
    10.   $new_array[] = $value;
    11. }
    12. }
    13. echo '<pre>';
    14. print_r($new_array);
    15. ?>
     
    Cyusik нравится это.
  5. Cyusik

    Cyusik Новичок

    С нами с:
    12 апр 2020
    Сообщения:
    12
    Симпатии:
    0
    Аааа.. Понял почему) Спасибо большое, помогло

    Второй вопрос пока отрытый..
     
  6. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Переформулируйте. с учетом проясненного.
     
  7. Cyusik

    Cyusik Новичок

    С нами с:
    12 апр 2020
    Сообщения:
    12
    Симпатии:
    0
    Я в первом посте не дописал немного
    HTML:
    1.  
    2. <select name="arrForm[]">
    3.    <option value="100">Строка_1</option>
    4.    <option value="100">Строка_2</option>
    5.    <option value="170">Строка_3</option>
    6.    <option value="150">Строка_4</option>
    7.    <option value="320">Строка_5</option>
    8.  
    value на стороне клиента используется для подсчета суммы при помощи js
    Так же при помощи js я отправляю в обработчик содержимое option.
    Я могу так же взять и отправить сумму post запросом в скрипт и записать её в бд, но ведь юзер в браузере, в коде, может поставить любое значение value и в итоге в бд запишется не та сумма, которая должна.
    Поэтому могу ли я считывать содержимое массива $new_array ( с которым Вы мне помогли) и формировать следующее:
    Если в массиве есть "Строка_1", то переменной присваивается значение 100. Если такая строка встречается дважды, то значение увеличивается, т.е. будет 200.
    Если "Строка_3", то назначается вторая переменная равная 170. По итогу все переменные складываются.
    Вроде как можно так же использовать in_array и искать таким образом каждую строку по отдельности, но будет ли это верным решением?
    PHP:
    1. if(in_array('Строка_1', $new_array)) {
    2.       $a = 100;
    3. }
    4. if(in_array('Строка_3', $new_array)) {
    5.       $b = 170;
    6. }
    7. $sum = $a + $b;
    пока ничего умнее не придумал..
     
  8. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Форма написанная в таком стиле отправит содержимое параметра value, например 170, а не "Строка_3".
    Причем только в одном экземпляре., если нужен множественный выбор используйте параметр multiple.
    HTML:
    1. <select multiple name="arrForm[]" size="5">
    2. <option value="100">Строка_1</option>
    3. <option value="100">Строка_2</option>
    4. <option value="170">Строка_3</option>
    5. <option value="150">Строка_4</option>
    6. <option value="320">Строка_5</option>  
    7.  
    Обработчик будет примерно таким:
    PHP:
    1. <?php
    2. //$goodvalues = array('1','2','3','4','5','6','7','8','9','other');
    3. $goodvalues = array('100','150','170','320');
    4. //$arrForm = array ('one','two','4','nine', 'other'); //получено из формы
    5. $arrForm = array ('100','100','170','150','320');
    6.  
    7. $sum = 0;
    8. foreach($arrForm as $value)
    9. {
    10. if(in_array($value, $goodvalues))
    11. {
    12.   //  $new_array[] = $value;
    13. $sum += $value;
    14. }
    15.  
    16.  
    17. }
    18.  
    19. echo '<pre>';
    20. //print_r($new_array);
    21. echo 'sum: '.$sum;
    22. ?>
     
  9. Cyusik

    Cyusik Новичок

    С нами с:
    12 апр 2020
    Сообщения:
    12
    Симпатии:
    0
    Я знаю. Поэтому
    код:
    Код (Text):
    1.  
    2. $(document).ready(function() {
    3.    $("#submit").click(function() {
    4.       $("select[name='arrForm[]'] > option").each(function() {
    5.          var content = $(this).text();
    6.          $(this).val(content);
    7.       });
    8.    });
    9. });
    В этом случае в post уходит не value, а как раз таки текст из option.
    multiple тоже не подходит, всё это не важно.

    Мне важно то, что описал выше. Как в зависимости от содержимого массива присвоить значение переменной.
     
  10. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    PHP:
    1. <?php
    2. //$goodvalues = array('1','2','3','4','5','6','7','8','9','other');
    3. //$goodvalues = array('100','150','170','320');
    4. $goodvalues  = array ('Строка_1','Строка_2','Строка_3','Строка_4','Строка_5');
    5.  
    6. //$arrForm = array ('one','two','4','nine', 'other'); //получено из формы
    7. $arrForm = array ('Строка_2','Строка_3','Строка_4','Строка_5');
    8.  
    9. $repl = array(
    10. 'Строка_1' => 100,
    11. 'Строка_2' => 100,
    12. 'Строка_3' => 170,
    13. 'Строка_4' => 150,
    14. 'Строка_5' => 320);
    15.  
    16. $sum = 0;
    17.  
    18. foreach($arrForm as $value)
    19. {
    20. if(in_array($value, $goodvalues))
    21. {
    22.  
    23.   //  $new_array[] = $value;
    24. // $sum += $value;
    25.   $sum += $repl[$value];
    26.  
    27. }
    28.  
    29. }
    30.  
    31. echo '<pre>';
    32. //print_r($new_array);
    33. echo 'sum: '.$sum;
    34. ?>
     
    Cyusik нравится это.
  11. Cyusik

    Cyusik Новичок

    С нами с:
    12 апр 2020
    Сообщения:
    12
    Симпатии:
    0
    Это то, что нужно.. Идеально. Спасибо больше :)