加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_常德站长网 (https://www.0736zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2022-10-24 11:27:34 所属栏目:PHP教程 来源:
导读:  在 PHP 中处理 JSON 数组以及对象

  与客户端混淆的常见原因是围绕 JSON 数组和对象,以及如何在 PHP 中指定他们。特别是,问题是由空对象和数组对象引起的,此页面将向您展示 Elasticsearch JSON API 中使
  在 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数组,而不是数组 。 在 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": {}
 
  -END-
 

(编辑:应用网_常德站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!