【问题标题】:Group serialized JS array into similar objects/arrays based on their ID根据 ID 将序列化的 JS 数组分组为相似的对象/数组
【发布时间】:2015-01-12 21:49:51
【问题描述】:

我有一个带有多维输入字段的复杂表单;

<input type="hidden" name="product[12267][ID]" value="76">
<input type="radio" name="product[12267][electrical_support]" value="1">
<input type="radio" name="product[12267][electrical_support]" value="0" checked="">
<input type="checkbox" name="product[12267][drinks]" value="1" >
<input type="radio" name="product[9999][electrical_support]" value="1">
<input type="hidden" name="product[9999][ID]" value="58">

使用jquery的ajax和serializeArray将表单发送到php;

var formData = new FormData();
formData.append('action', 'add_to_cart');
formData.append('products', $(form).serializeArray());

这会在控制台中输出一个对象数组,例如:

0: Object
     name: "product[12267][starting_price]"
     value: "15"
1: Object
     name: "product[12267][ID]"
     value: "79"
...

我的问题是如何根据 ID 将多个对象(在 js 中或在 php 中)分组/排列成单个产品数组,例如;

$products[12267] = array('starting_price' => 15, 'ID' => 79);

希望我能很好地解释这个案例,如果我需要提供更多详细信息,请告诉我

【问题讨论】:

    标签: php jquery arrays forms serialization


    【解决方案1】:

    经过一些尝试/错误后,我发现我不需要在 js 中使用 serializeArray(),因为这会杀死表单输入字段中的关联数组! 解决方法是监听表单提交事件,并在 FormData 中传递;

    var formData = new FormData(event.target);
    

    然后在 PHP 中,使用类似的东西;

    $products = isset($_POST['product']) ? $_POST['product'] : false;
    

    产品保持表单输入字段数组不变。

    【讨论】:

      【解决方案2】:

      除非我遗漏了什么,否则假设 $inproducts 来自 $_POST['product'] 并且包含一个参差不齐的产品信息数组,这应该可以工作。

      $products = array();    
      foreach ($inproducts as $key=>$inproductarray) {
              if (!isset($products[$key])) {
                  $products[$key]=array();
              }
              foreach ($inproductarray as $subkey=>$subvalue) {
                  $products[$key][$subkey] = $subvalue;
              }
          }
      

      请注意,生成的数组仍然可能是参差不齐的。如果在 POST 数组中找不到表单字段,则不会将其添加到结果数组中。如果您需要确保所有产品都具有所有属性,请在为产品创建数组时命名键:

      $products[$key]=array('id'=>$key,'starting_price'=null,'electrical_support='null',etc).
      

      它们将在您迭代 $inproductarray 时被填充。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-12
        • 2017-05-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-23
        • 1970-01-01
        相关资源
        最近更新 更多