【问题标题】:PHP handling multi-dimensional object//array from AJAX Jquery postPHP处理来自AJAX Jquery帖子的多维对象//数组
【发布时间】:2019-11-25 18:16:41
【问题描述】:

我在 JS 中有一个大型多维数组对象,我试图使用 Ajax 将其传递给 PHP。一些数组值的键是写入数组test[key],在 PHP 中我希望它们被读取为test => array([key] => 123)。请注意,我正在使用 Wordpress。

工作示例

JS:

var args = {
    'action' : 'save',
    'test[key1]' : ['123', 'abc']
}

var request = $.ajax({
    url: settings.get('ajaxurl'),
    data: args,
    type: 'post',
    success: function(response) { // }
});

PHP print_r 输出:

[action] => save
[test] => Array
    (
        [key1] => Array
             (
                 [0] => 123
                 [1] => 234
             )
      )

但是,我想在对象的第二级发送所有 test[key1](以及更多数据)。我有很多数据,需要对它们进行相应的分组。

无效示例

JS:

// simple changing the args
var args = {
    'action' : 'save',
    'data' : {  
        'test[key1]' : ['123', 'abc']
    }
}

PHP print_r 输出:

[action] => save  
[data] => Array
    (
        [test[key1] => Array
             (
                 [0] => 123
                 [1] => 234
             )
     )

这似乎真的很难解释 - 但是当 PHP 不在数组的顶层时,它似乎没有正确解析数组键。我做错了什么//有没有办法解决这个问题?如果需要,我可以提供更多见解,我试图尽可能清楚地说明这一点。

当打印数据数组的键时,它会打印它们而不是最终的]。所以它显示test[key1 而不是我所期望的。也许他们在某个地方被剥光了?

【问题讨论】:

  • PHP 做得对,也许你是那个有点困惑的人
  • @RiggsFolly 我编辑了我的标题 - 我并不想责怪 PHP,我绝对认为我做错了什么。
  • args 中,您试图创建2 个具有相同名称test[key1] 的属性,这在任何语言中都是不合法的,是吗?
  • @RiggsFolly 好吧,它只会覆盖它......但你是对的 - 在试图简化我的代码时,我确实犯了那个错误。我对其进行了编辑以反映我实际在做什么..

标签: php jquery ajax wordpress


【解决方案1】:

我认为你需要对数据进行字符串化

var request = $.ajax({
   url: settings.get('ajaxurl'),
   data: JSON.stringify(args),
   type: 'post',
   success: function(response) { // }});

然后使用json_decode 使其在 PHP 中有用。

编辑:

这可能会带你去你想去的地方......

var args = {
'action' : 'save',
test : {
   key1 : [
    '123',
    'abc' ]
  } }

由于 JavaScript 不允许关联数组。

【讨论】:

  • jQuery 应该为你做所有这些
  • 我尝试了这个 - 但我无法获得 WP 用来正常运行的字符串化和操作(可能是一个不同的问题,但我想先弄清楚我在这里做错了什么)。
  • 所以我最终得到了这个工作 - 从某种意义上说,斜杠没有被剥离,但是在 PHP 中解析回 JSON 之后,它没有按照我的意愿读取数组,只是描绘了键作为字符串。 test[key1] 而不是数组
【解决方案2】:

请试试这个参数,这将给出多维数组结果。

    var args = {
    'action' : 'save',
    'data' : {  
        'test': {
            'key1' : ['123', 'abc']
        }
    }
}

【讨论】:

  • 我不是手动创建这个对象 - 所以它需要遍历每个键并将其分开。我不完全确定如何执行此操作(可能是正则表达式) - 因为我不确定密钥对是什么。
  • 您必须创建一个与 args 相同的对象。如果你能把完整的代码发给我,那么会对你有所帮助。
  • 我正在从nameinput 属性中获取密钥。也许这足以工作? var key = $('input').attr('name');
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-21
  • 2014-10-01
相关资源
最近更新 更多