Gérer les tableaux JSON ainsi que les objets en PHP

藏色散人
Libérer: 2023-04-07 07:20:02
avant
3077 Les gens l'ont consulté

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)
        }
    }
}
Copier après la connexion

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);
Copier après la connexion

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"}}
    ]
}
Copier après la connexion

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);
Copier après la connexion

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);
Copier après la connexion

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"
      }
   }
}
Copier après la connexion

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);
Copier après la connexion

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!

Étiquettes associées:
php
source:learnku.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!