在PHP中处理JSON数组以及对象

藏色散人
发布: 2019-08-10 13:59:35
转载
3306人浏览过

php 中处理 json 数组以及对象

与客户端混淆的常见原因是围绕 JSON 数组和对象,以及如何在 PHP 中指定他们。特别是,问题是由空对象和数组对象引起的,此页面将向您展示 Elasticsearch JSON API 中使用的一些常见模式,以及如何将其转换为 PHP 的表现形式。

空对象

Elasticsearch API 在多个位置上使用空的 JSON 对象,这可能会给 PHP 带来问题。与其他语言不同,PHP 没有空对象的「简短」表现形式。因此许多开发人员不知道如何指定空对象。

考虑在查询中添加突出显示:

立即学习PHP免费学习笔记(深入)”;

{
    "query" : {
        "match" : {
            "content" : "quick brown fox"
        }
    },
    "highlight" : {
        "fields" : {
            "content" : {} (1)
        }
    }
}
登录后复制

1.这个空的 JSON 对象是导致问题的原因。

问题是 PHP 会自动转换 "content" : {} 成 "content" : [],这样将不再是有效的 Elasticsearch DSL。我们需要告诉 PHP 空对象是一个显示对象,而不是数组 。 在 PHP 中 定义此查询, 您可以:

$params['body'] = array(
    'query' => array(
        'match' => array(
            'content' => 'quick brown fox'
        )
    ),
    'highlight' => array(
        'fields' => array(
            'content' => new \stdClass() (1)
        )
    )
);
$results = $client->search($params);
登录后复制

我们使用通用的 PHP stdClass 对象来表示一个空对象,JSON 将会被正确解码。

通过使用显示的 stdClass 对象,我们可以强制使用 json_encode 解析器正确的输出空对象,而不是空数组。 遗憾的是,这个冗长的解决方案,是在 PHP 中实现目标的唯一方法...... 并没有空对象的「简短」版本。

对象数组

Elasticsearch DSL 中的另一种常见模式是对象数组。例如,考虑为查询添加排序:

{
    "query" : {
        "match" : { "content" : "quick brown fox" }
    },
    "sort" : [  (1)
        {"time" : {"order" : "desc"}},
        {"popularity" : {"order" : "desc"}}
    ]
}
登录后复制

1.「sort」包含一组 JSON 对象

这种安排很常见,但是 PHP 的结构可能很复杂。 因为他需要嵌套数组。PHP 的冗长往往会掩盖实际发生的事。要构造一个对象数组,实际上需要一个数组数组 :

Find JSON Path Online
Find JSON Path Online

Easily find JSON paths within JSON objects using our intuitive Json Path Finder

Find JSON Path Online 30
查看详情 Find JSON Path Online
$params['body'] = array(
    'query' => array(
        'match' => array(
            'content' => 'quick brown fox'
        )
    ),
    'sort' => array(    (1)
        array('time' => array('order' => 'desc')),  (2)
        array('popularity' => array('order' => 'desc')) (3)
    )
);
$results = $client->search($params);
登录后复制

1.该数组对  "sort" : [] 数组进行编码

2.该数组对  {"time" : {"order" : "desc"}} 对象进行编码

3.该数组对 {"popularity" : {"order" : "desc"}} 对象进行编码

如果您使用 5.4+ 以上的版本,我强烈建议你使用短数组语法。它使这些嵌套数组更容易阅读:

$params['body'] = [
    'query' => [
        'match' => [
            'content' => 'quick brown fox'
        ]
    ],
    'sort' => [
        ['time' => ['order' => 'desc']],
        ['popularity' => ['order' => 'desc']]
    ]
];
$results = $client->search($params);
登录后复制

空对象数组

有时, 您会遇到前面两种模式的 DSL . 这个得分函数的查询是一个很好的例子,有时他需要一个空的对象数组,其中一些对象可能是空的 JSON 对象。

例如这种查询:

{
   "query":{
      "function_score":{
         "functions":[
            {
               "random_score":{}
            }
         ],
         "boost_mode":"replace"
      }
   }
}
登录后复制

我们可以使用以下 PHP 代码构建它:

$params['body'] = array(
    'query' => array(
        'function_score' => array(
            'functions' => array(  (1)
                array(  (2)
                    'random_score' => new \stdClass() (3)
                )
            )
        )
    )
);
$results = $client->search($params);
登录后复制

1.它对对象数组进行编码: "functions" : []

2.它对数组中的对象进行编码: { "random_score": {} }

3.T 它对空的 JSON 对象进行编码: "random_score": {}

推荐:【PHP教程

以上就是在PHP中处理JSON数组以及对象的详细内容,更多请关注php中文网其它相关文章!

相关标签:
PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:learnku网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号