在PHP中如何处理JSON数组以及对象?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
在 PHP 中处理 JSON 数组以及对象
与客户端混淆的常见原因是围绕 JSON 数组和对象,以及如何在 PHP 中指定他们。特别是,问题是由空对象和数组对象引起的,此页面将向您展示 Elasticsearch JSON API 中使用的一些常见模式,以及如何将其转换为 PHP 的表现形式。
空对象
Elasticsearch API 在多个位置上使用空的 JSON 对象,这可能会给 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 的冗长往往会掩盖实际发生的事。要构造一个对象数组,实际上需要一个数组数组 :
$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": {}
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。