【问题标题】:$.post is changing array of objects to array of arrays$.post 正在将对象数组更改为数组数组
【发布时间】:2023-03-19 19:02:01
【问题描述】:

我尝试通过 ajax 发布一些数据。观看截图 1。但是 jQuery 自动将对象转换为数组。这可以在 screenshot2(chrome 开发者工具)中看到。

数据发送到 $.post:

chrome 开发者工具中的数据检查:

已编辑:

PHP 中出现问题,我希望 Data 属性是对象数组:

我想读取这样的数据:

foreach ($_POST["Data"] as $field)
{
    if ($field->Field == "username")
    {
            ...
    }
}

【问题讨论】:

  • 它是一个对象数组。更具体地说,它是一个包含对象数组作为其属性之一的对象。
  • 对于此类问题,它可以帮助解释您实际尝试获得的输出。
  • “问题出现在 PHP 中,我希望 Data 属性是对象数组” 您的对象将是 PHP 中的关联数组。那是问题吗?或者,您可以将整个数组编码为 JSON。
  • 不是答案,但对于上面的行,options.Parameters = options.Parameters || {} 更短,并且可能更有效。
  • 你可以把$field->Field 改成$field['Field'],问题就解决了。或者如我所说,将数据编码为 JSON。

标签: javascript php jquery ajax http-request-parameters


【解决方案1】:

PHP 文档中并没有很好地说明它,但它应该是这样工作的。例如,request variables 上的页面对类似数组的 cookie 有这样的说法:

如果您希望为单个 cookie 变量分配多个值,您可以将其分配为数组。例如:

<?php
  setcookie("MyCookie[foo]", 'Testing 1', time()+3600);
  setcookie("MyCookie[bar]", 'Testing 2', time()+3600);
?>

这将创建两个单独的 cookie,尽管 MyCookie 现在将成为脚本中的单个数组。如果您只想设置一个具有多个值的 cookie,请考虑先对值使用 serialize() 或 explode()。

换句话说,当您发送时:

FormData[0][Field]: username
FormData[0][Value]: test3

PHP 将其解释为数组数组,如下所示:

array(1) {
  [0]=> array(2) {
    ['Field'] => String(8) "username",
    ['Value'] => String(5) "test3"
  }
}

你可以像这样解析它:

foreach ($_POST["Data"] as $field)
{
    if ($field['Field'] == "username")
    {
            ...
    }
}

请记住,PHP array is actually an ordered map。换句话说,它非常适合存储您通过 POST 传递的 key => value 数据。

您似乎期望$_POST 包含简单的对象(又名stdClass),但它根本没有。 PHP 中的大多数 SOAP 助手都会为您提供简单的对象响应(这是 PHP 行为的典型混合)。如果您真的想将每个 $_POST["Data"] 字段转换为对象,请参阅 this question 了解一些想法。但这将是昂贵且不必要的。

【讨论】:

    【解决方案2】:

    答案是您实际上是在发送一个对象数组——而不是您想象的数组数组。以下是您发送到服务器的数据示例:

    {
        Operations: "Add",
        TableName: "users",
        Data: [
            {
                Field: "username",
                Value: "test3"
            },
            {
                Field: "someOtherField",
                Value: "test4"
            },
            // ...
        ]
    }
    

    如果在 PHP 端你期望只一个对象数组,而不是一个包含对象数组的对象,那么你应该传递options.Parameters.Data,例如:

    var result = $.post(url, options.Parameters.Data, // ...
    

    【讨论】:

    • 他说“我希望 for Data 属性 是对象数组”
    • 是的,以前没有。但是,无论哪种方式,它都是一个对象数组。
    猜你喜欢
    • 2021-07-02
    • 1970-01-01
    • 1970-01-01
    • 2021-08-20
    • 2021-01-17
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多