Gestion des tableaux et objets JSON en PHP
Une cause fréquente de confusion chez les clients concerne les tableaux et objets JSON et la manière de les spécifier en PHP. En particulier, les problèmes sont causés par des objets vides et des objets tableau. Cette page vous montrera quelques modèles courants utilisés dans l'API Elasticsearch JSON et comment les convertir en représentations PHP.
Objets vides
L'API Elasticsearch utilise des objets JSON vides à plusieurs endroits, ce qui peut poser des problèmes pour PHP. Contrairement à d'autres langages, PHP n'a pas de représentation « courte » d'un objet vide. C'est pourquoi de nombreux développeurs ne savent pas comment spécifier des objets vides.
Pensez à ajouter une mise en surbrillance à la requête :
{ "query" : { "match" : { "content" : "quick brown fox" } }, "highlight" : { "fields" : { "content" : {} (1) } } }
1. Cet objet JSON vide est à l'origine du problème.
Le problème est que PHP convertit automatiquement "content" : {} en "content" : [], qui n'est plus un DSL Elasticsearch valide. Nous devons dire à PHP que l'objet vide est un objet d'affichage, pas un tableau. Pour définir cette requête en PHP, vous feriez :
$params['body'] = array( 'query' => array( 'match' => array( 'content' => 'quick brown fox' ) ), 'highlight' => array( 'fields' => array( 'content' => new \stdClass() (1) ) ) ); $results = $client->search($params);
Nous utilisons l'objet générique PHP stdClass pour représenter un objet vide et le JSON sera décodé correctement.
En utilisant un objet stdClass explicite, nous pouvons forcer l'analyseur json_encode à générer correctement des objets vides au lieu de tableaux vides. Malheureusement, cette solution longue est le seul moyen d'atteindre votre objectif en PHP... Il n'existe pas de version "courte" de l'objet vide.
Tableau d'objets
Un autre modèle courant dans le DSL Elasticsearch est le tableau d'objets. Par exemple, pensez à ajouter un tri à une requête :
{ "query" : { "match" : { "content" : "quick brown fox" } }, "sort" : [ (1) {"time" : {"order" : "desc"}}, {"popularity" : {"order" : "desc"}} ] }
1 "sort" contient un ensemble d'objets JSON
Cet arrangement est courant, mais la structure de PHP peut être complexe. Parce qu'il a besoin de tableaux imbriqués. La verbosité de PHP a tendance à obscurcir ce qui se passe réellement. Pour construire un tableau d'objets, vous avez en fait besoin d'un tableau de tableaux :
$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 Ce tableau code "sort" : [] array
Ce tableau code {"time" : {"order" : "desc"}} les objets sont codés
3. Le tableau encode les objets {"popularity" : {"order" : "desc"}}
Si vous utilisez la version. 5.4+, je vous recommande fortement d'utiliser une syntaxe de tableau court. Cela rend ces tableaux imbriqués plus faciles à lire :
$params['body'] = [ 'query' => [ 'match' => [ 'content' => 'quick brown fox' ] ], 'sort' => [ ['time' => ['order' => 'desc']], ['popularity' => ['order' => 'desc']] ] ]; $results = $client->search($params);
Tableau d'objets vides
Parfois, vous rencontrerez le DSL pour les deux modèles précédents. Cette requête pour le score. function est un bon exemple, il a parfois besoin d'un tableau vide d'objets, dont certains peuvent être des objets JSON vides.
Par exemple cette requête :
{ "query":{ "function_score":{ "functions":[ { "random_score":{} } ], "boost_mode":"replace" } } }
On peut la construire en utilisant le code PHP suivant :
$params['body'] = array( 'query' => array( 'function_score' => array( 'functions' => array( (1) array( (2) 'random_score' => new \stdClass() (3) ) ) ) ) ); $results = $client->search($params);
1 Elle code un tableau d'objets : "functions" : []
2. Il encode les objets du tableau : { "random_score": {} }
3.T Il encode l'objet JSON vide : "random_score": {}
Recommandé : [Tutoriel PHP]
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!