Umgang mit JSON-Arrays und -Objekten in PHP
Eine häufige Ursache für Verwirrung bei Clients sind JSON-Arrays und -Objekte und deren Angabe in PHP. Probleme werden insbesondere durch leere Objekte und Array-Objekte verursacht. Diese Seite zeigt Ihnen einige häufig verwendete Muster, die in der Elasticsearch-JSON-API verwendet werden, und wie Sie diese in PHP-Darstellungen konvertieren.
Leere Objekte
Die Elasticsearch API verwendet an mehreren Stellen leere JSON-Objekte, was zu Problemen für PHP führen kann. Im Gegensatz zu anderen Sprachen verfügt PHP nicht über eine „kurze“ Darstellung eines leeren Objekts. Daher wissen viele Entwickler nicht, wie sie leere Objekte angeben.
Erwägen Sie, der Abfrage eine Hervorhebung hinzuzufügen:
{ "query" : { "match" : { "content" : "quick brown fox" } }, "highlight" : { "fields" : { "content" : {} (1) } } }
1. Dieses leere JSON-Objekt verursacht das Problem.
Das Problem besteht darin, dass PHP automatisch „content“ : {} in „content“ : [] konvertiert, was kein gültiges Elasticsearch-DSL mehr ist. Wir müssen PHP mitteilen, dass das leere Objekt ein Anzeigeobjekt und kein Array ist. Um diese Abfrage in PHP zu definieren, würden Sie Folgendes tun:
$params['body'] = array( 'query' => array( 'match' => array( 'content' => 'quick brown fox' ) ), 'highlight' => array( 'fields' => array( 'content' => new \stdClass() (1) ) ) ); $results = $client->search($params);
Wir verwenden das generische PHP-Objekt stdClass, um ein leeres Objekt darzustellen, und der JSON wird korrekt dekodiert.
Durch die Verwendung eines expliziten stdClass-Objekts können wir den json_encode-Parser zwingen, leere Objekte anstelle leerer Arrays korrekt auszugeben. Leider ist diese langwierige Lösung die einzige Möglichkeit, Ihr Ziel in PHP zu erreichen ... Es gibt keine „kurze“ Version des leeren Objekts.
Array von Objekten
Ein weiteres häufiges Muster im Elasticsearch DSL ist das Array von Objekten. Erwägen Sie beispielsweise das Hinzufügen einer Sortierung zu einer Abfrage:
{ "query" : { "match" : { "content" : "quick brown fox" } }, "sort" : [ (1) {"time" : {"order" : "desc"}}, {"popularity" : {"order" : "desc"}} ] }
1. „sort“ enthält eine Reihe von JSON-Objekten
Diese Anordnung ist üblich, aber die Struktur von PHP kann komplex sein. Weil er verschachtelte Arrays braucht. Die Ausführlichkeit von PHP neigt dazu, zu verschleiern, was tatsächlich vor sich geht. Um ein Array von Objekten zu erstellen, benötigen Sie tatsächlich ein Array von Arrays:
$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 Dieses Array codiert „sort“: [] array
2. {"order" : "desc"}} Objekte werden codiert
3. Das Array ist codiert {"popularity" : {"order" : "desc"}} Objekte
Wenn Sie verwenden Ab Version 5.4 empfehle ich dringend die Verwendung einer kurzen Array-Syntax. Dies erleichtert das Lesen dieser verschachtelten Arrays:
$params['body'] = [ 'query' => [ 'match' => [ 'content' => 'quick brown fox' ] ], 'sort' => [ ['time' => ['order' => 'desc']], ['popularity' => ['order' => 'desc']] ] ]; $results = $client->search($params);
Array leerer Objekte
Manchmal werden Sie auf die DSL für die beiden vorherigen Muster stoßen Die Funktion ist ein gutes Beispiel. Manchmal benötigt er ein leeres Array von Objekten, von denen einige leere JSON-Objekte sein können.
Zum Beispiel diese Abfrage:
{ "query":{ "function_score":{ "functions":[ { "random_score":{} } ], "boost_mode":"replace" } } }
Wir können sie mit dem folgenden PHP-Code erstellen:
$params['body'] = array( 'query' => array( 'function_score' => array( 'functions' => array( (1) array( (2) 'random_score' => new \stdClass() (3) ) ) ) ) ); $results = $client->search($params);
1 Es codiert ein Array von Objekten: „functions“: []
2. Es kodiert die Objekte im Array: { "random_score": {} }
3. Es kodiert das leere JSON-Objekt: "random_score": {}
Empfohlen: [PHP-Tutorial]
Das obige ist der detaillierte Inhalt vonBehandeln Sie JSON-Arrays und -Objekte in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!