>  기사  >  백엔드 개발  >  PHP에서 JSON 배열 및 객체 처리

PHP에서 JSON 배열 및 객체 처리

藏色散人
藏色散人앞으로
2019-08-10 13:59:353128검색

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의 이전 두 패턴을 접하게 되는 경우가 있습니다. 점수 함수에 대한 이 쿼리는 좋은 예이며 때로는 빈 An이 필요합니다. 객체 배열. 그 중 일부는 빈 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 Tutorial]

위 내용은 PHP에서 JSON 배열 및 객체 처리의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 learnku.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제