组根据其ID将JS阵列序列化为类似的对象/数组

时间:2014-11-15 16:32:29

标签: php jquery arrays forms serialization

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

<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或更高版本的preior)分组/排列到单个产品数组中,如:

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

希望我能很好地解释这个案例,如果我需要提供进一步的细节,请告诉我

2 个答案:

答案 0 :(得分:2)

除非我遗漏了某些内容,否则这应该是假设$ inproducts来自$ _POST [&#39;产品&#39;]并且包含一系列不规则的产品信息。

$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时,它们会被填充。

答案 1 :(得分:1)

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

var formData = new FormData(event.target);

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

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

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