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 のもう 1 つの一般的なパターンは、オブジェクトの配列です。たとえば、クエリに並べ替えを追加することを検討してください:
{ "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」をエンコードします: [] array
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);
空のオブジェクト配列
場合によっては、前の 2 つのパターンの 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 中国語 Web サイトの他の関連記事を参照してください。