PHP で JSON 配列とオブジェクトを処理する

藏色散人
リリース: 2023-04-07 07:20:02
転載
3077 人が閲覧しました

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 サイトの他の関連記事を参照してください。

関連ラベル:
php
ソース:learnku.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!