在PHP中

时间:2019-01-13 23:59:44

标签: php jquery forms

我正在创建一个Web表单,该表单可能具有多个具有相同表单元素名称的输入。我需要检索表单的结果并一一输出。

即。 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 :(得分:0)

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数组中的条目codeIdsupplier(您可以检查或强制执行此操作。

答案 1 :(得分:0)

合并要发送的数据时,请注意以下事项。

$(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()来迭代组选择。

希望有帮助。