PHP从jquery序列化多行反序列化

问题描述 投票:0回答:1

下午好,

我们正在使用.serialize()函数进行jquery ajax调用。我们这样做是因为表单有多个列/行,我们希望通过一次调用ajax来保存。 serialize函数获取所有相关的表单数据并将其序列化。这是发送到php ajax调用的内容。

$.ajax({
    type: "POST",
            url: "ajax/SaveClaimParts.php",
            data: { 
                'ClaimID': $('.hdn-claim-id').val(),
                'Parts': $('.parts-form').serialize()
            },
            dataType: "json",
            success: function(data)
            {
                console.log("Happy");
            },
            error: function()
            {
                console.log("An error occurred while processing the save.");
            }
        });             

这很好用,因为当我看到发送到要处理的服务器的内容看起来像这样。

claim_part_no = 12349&claim_part_desc = TUBE&claim_part_no = 85555&claim_part_desc =支架

请注意重复的part_no和part_desc。这不是错误,而是我们想要提交2行的事实。每行包含一个部分#和一个部分desc。

现在的问题是我如何在php中打破这个字符串,以便可以逐行保存/插入。

这是我尝试过的:

$Parts = $_POST['Parts'];
$PartsArray = array();
parse_str($Parts, $PartsArray);

这有效,但它只有$ PartsArray中的最后一行。任何帮助将非常感激。

谢谢。乔治艾瓦兹

php jquery json serialization
1个回答
1
投票

根据您提供的字符串:

claim_part_no = 12349&claim_part_desc = TUBE&claim_part_no = 85555&claim_part_desc =支架

编辑:由于您有重复键,因此不使用关联数组更有意义。以下代码已更新,以反映在javascript序列化中重复保留您的密钥。

您可以使用strpossubstr解析这个,如下所示:

$current_key = 0;
foreach ( explode( '&', $str ) as $substring )
{
    $divisor = strpos( $substring, '=' );
    $key = substr( $substring, 0, $divisor );
    $val = substr( $substring, $divisor + 1, strlen( $substring ) );
    $PartsArray[$current_key][$key] = $val;
    if ( $key == 'claim_part_no' )
    {
        $current_key++;
    }
}

那么如果你var_dump( $partsArray );你应该得到这样的东西:

array (size=2)
  0 => 
    array (size=2)
      'claim_part_no' => string '12349' (length=5)
      'claim_part_desc' => string 'TUBE' (length=4)
  1 => 
    array (size=2)
      'claim_part_no' => string '85555' (length=5)
      'claim_part_desc' => string 'BRACKET' (length=7)

只要您的序列化不包含&=作为返回值的一部分,这应该可以正常工作,所以不要用它来解析任何url编码的东西(&将编码为&并打破这个)。

© www.soinside.com 2019 - 2024. All rights reserved.