Получать результаты в виде массивов по одному в PHP - PullRequest
0 голосов
/ 14 января 2019

Я создаю веб-форму, которая потенциально имеет несколько входов с одинаковыми именами элементов формы. Мне нужно получить результаты формы и вывести их по одному.

т. name="supplier[]" и name="listPrice[]" могут иметь несколько результатов, и мне нужно, чтобы результаты каждого массива возвращались по порядку:
Поставщик: [0], Прайс-лист: [0]
Поставщик: [1], Прайс-лист: [1]
и т. д.

У меня есть счетчик, который также сохраняется в виде массива для предоставления контекста для каждого «сгруппированного» результата, и цикл foreach в настоящее время обеспечивает правильный вывод для счетчика, но ничего больше. Возможно, мои ограниченные знания PHP / массива или просто слишком долго на это смотрели, заставили меня полностью упустить лучшее решение.

Структура формы выглядит следующим образом:

<h4>Request #` + counter + `</h4>
            <input type="hidden" name="codeId[]" class="code-id" value="` + counter + `">

<select class="custom-select supplier-select" name="supplier[]" id="supplier` + counter +`">
    <option selected value>Default</option>
    <option value="One">Supplier One</option>
    <option value="Two">Supplier Two</option>
    <option value="Three">Supplier Three</option>
</select>

<input type="text" placeholder="" class="form-control list-price" name="listPrice[]" aria-label="List Price" required>

jQuery захватывает результат и сохраняет его в нескольких массивах, а затем переходит к process.php:

var formValues = {
            codeId          :   $('.code-id'),
            supplier        :   $('.supplier-select'),
            listPrice       :   $('.list-price')
        };

        $.each(formValues, function(key, value) {
            var data = value.map(function() {
                return $(this).val();
            }).get();

            for (var i = 0; i < data.length; i++) {
                formData.append(key + '[]', data[i]);
                console.log(key + " " + data);
            }
        });

Затем моя попытка перебрать каждый из них в PHP, и я должен сохранить как одну строку для передачи в мой почтовый код:

if(is_array($codeId)) {

            foreach ($supplier as $key => $value) {
                $suppliers .= $value;
            }
            foreach ($listPrice as $key => $value) {
                $listPrices .= $value;
            }

            foreach ($codeId as $key => $value) {
                $string .= "Request #" . $codeId[$key] . "<br />";
                $string .= $suppliers . "<br />";
                $string .= $listPrices . "<br />";
            }

        } else {
            $string = 'Failed';
        }

Отправка формы как эта -
Поставщик: [выбрать] один, цена по прейскуранту: [вход] 3423
Поставщик: [выберите] Два, Список Цена: [вход] 466

Появляется ниже, я знаю, что я близко, но просто не знаю, как лучше это сделать!

Request #1
OneTwo
3423466
Request #2
OneTwo
3423466

Что мне не хватает? Или как это можно сделать лучше? Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 14 января 2019

При объединении данных для отправки учитывайте следующее.

$(function() {
  var formValues1 = {
    codeId: $('.code-id').val(),
    supplier: $('.supplier-select').val(),
    listPrice: $('.list-price').val()
  };
   var formValues2 = {
    "codeId[]": $('.code-id').val(),
    "supplier[]": $('.supplier-select').val(),
    "listPrice[]": $('.list-price').val()
  };

  var formData = new FormData();

  $.each(formValues1, function(key, value) {
    formData.append(key + '[]', value);
    console.log(key + ": " + value);
  });
  console.log(JSON.stringify(formValues2));
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<h4>Request #1</h4>
<input type="hidden" name="codeId[]" class="code-id" value="1">

<select class="custom-select supplier-select" name="supplier[]" id="supplier-1">
  <option selected value>Default</option>
  <option value="One">Supplier One</option>
  <option value="Two">Supplier Two</option>
  <option value="Three">Supplier Three</option>
</select>

<input type="text" placeholder="" class="form-control list-price" name="listPrice[]" aria-label="List Price" required>

Вы также можете использовать .each() для повторения выбора группы.

Надеюсь, это поможет.

0 голосов
/ 14 января 2019

PHP-скрипт делает именно то, что вы написали. Вы объединяете результаты в одну строку, и это то, что вы выводите. Похоже, что вы хотите, чтобы каждый результат был в отдельных разделах.

Вы можете добиться этого, используя итератор $key в цикле foreach (третий), чтобы выбрать соответствующие элементы в других массивах, например:

if(is_array($codeId)) {

    // get rid of the other loops

    $string = "";
    foreach ($codeId as $key => $value) {
        $string .= "Request #" . $codeId[$key] . "<br />";
        $string .= $supplier[$key] . "<br />";
        $string .= $listPrice[$key] . "<br />";
    }
}

Это предполагает, что все они имеют одинаковую длину, и что запись i в listPrices соответствует записи i в массиве codeId и supplier (вы можете проверить это или принудительно применить его при необходимости быть).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...