在PHP中處理JSON數組以及對象

藏色散人
發布: 2023-04-07 07:20:02
轉載
3135 人瀏覽過

在 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 . 這個得分函數的查詢是一個很好的例子,有時他需要一個空的物件數組,其中一些物件可能是空的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中文網其他相關文章!

相關標籤:
php
來源:learnku.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板