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의 이전 두 패턴을 접하게 되는 경우가 있습니다. 점수 함수에 대한 이 쿼리는 좋은 예이며 때로는 빈 An이 필요합니다. 객체 배열. 그 중 일부는 빈 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 Tutorial]
위 내용은 PHP에서 JSON 배열 및 객체 처리의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!