[PHP 입문] 제이슨encode에서 그룹 대상으로 명확하게 인코딩하기

27872 단어 PHPJSONtech

총결산

  • 명확하게 배열할 때array_values에 배치
  • 객체를 명시적으로 설정한 경우JSON_FORCE_OBJECT 추가 옵션
  • 빈 객체만 원하는 경우 stdClass()
  • 본문


    PHP 정렬 및 Lenovo 정렬


    PHP의 배열과 연상 배열은 같은 문법으로 알려져 있다.
    array_map.php
    <?php
    
    $array = [
        0 => 'dog',
        1 => 'cat',
        2 => 'bear',
        3 => 'rabbit',
        4 => 'fox',
    ];
    
    echo json_encode($array) . PHP_EOL;
    
    $map = [
        'apple' => 'red',
        'lemon' => 'yellow',
        'grape' => 'purple',
        'melon' => 'green',
        'peach' => 'pink',
    ];
    
    echo json_encode($map);
    
    그러나 json_encode를 인코딩할 때 각각 수조의 대상이 된다.총명하다.
    php array_map.php
    ["dog","cat","bear","rabbit","fox"]
    {"apple":"red","lemon":"yellow","grape":"purple","melon":"green","peach":"pink"}
    

    배치할 수 없는 트랩 및 해결 방법


    함정.


    그러나 json_encode를 지나치게 믿으면 생각과 다른 인코딩으로 인코딩될 때가 있다.
    다음은 수조array_filter를 필터한 수조를 인코딩한 것이다.
    array_trap.php
    <?php
    
    $array = [
        0 => 'dog',
        1 => 'cat',
        2 => 'bear',
        3 => 'rabbit',
        4 => 'fox',
    ];
    
    // 3文字以下のみを選択
    $filtered_array = array_filter($array, function ($value) {
        return strlen($value) <= 3;
    });
    
    // フィルターされた配列が返ってくると期待
    echo json_encode($filtered_array);
    
    그러나 이 스크립트를 실행하면 대상이 의외로 되돌아옵니다.
    php array_trap.php
    {"0":"dog","1":"cat","4":"fox"}
    
    결과를 보면 왜 이러는지 알 수 있다.
  • array_filter에서 키 유지
  • 0에서 시작하는 연속적인 인덱스가 아니면 연상 배열로 판정하고 인코딩은 대상
  • 해결책


    이를 해결하는 방법으로는 일반적으로 array_values에 숫자의 첨가자를 다시 넣는다.
    array1.php
    <?php
    
    $array = [
        0 => 'dog',
        1 => 'cat',
        2 => 'bear',
        3 => 'rabbit',
        4 => 'fox',
    ];
    
    // 3文字以下のみを選択
    $filtered_array = array_filter($array, function ($value) {
        return strlen($value) <= 3;
    });
    
    // 数字の添字を付け直す
    $filtered_array = array_values($filtered_array);
    
    echo json_encode($filtered_array);
    
    순조롭게 배열될 겁니다.
    php array1.php
    ["dog","cat","fox"]
    

    대상이 되지 않는 트랩 및 해결 방법


    트랩 1


    다음 예에서는 $map 에서 blue 값만 선택합니다.
    실제로blue가 없기 때문에 여과한 결과는 공연상 배열일 수 있습니다.
    map_trap1.php
    <?php
    
    $map = [
        'apple' => 'red',
        'lemon' => 'yellow',
        'grape' => 'purple',
        'melon' => 'green',
        'peach' => 'pink',
    ];
    
    // 青色だけを選択。結果は空連想配列。
    $filtered_map = array_filter($map, function ($value) {
        return $value === 'blue';
    });
    
    // 空オブジェクトを期待
    echo json_encode($filtered_map);
    
    
    그러나 사실상 결과는 빈 배열이었다.
    php map_trap1.php
    []
    
    json_encode별로는 빈 배열인지 빈 연상 배열인지 구분할 수 없어 빈 배열로 판정됐다.

    해결 방법 1

    json_encode에는 JSON_FORCE_OBJECT 옵션이 있습니다.
    map1.php
    <?php
    
    $map = [
        'apple' => 'red',
        'lemon' => 'yellow',
        'grape' => 'purple',
        'melon' => 'green',
        'peach' => 'pink',
    ];
    
    // 青色だけを選択
    $filtered_map = array_filter($map, function ($value) {
        return $value === 'blue';
    });
    
    // 強制的にオブジェクトにする
    echo json_encode($filtered_map, JSON_FORCE_OBJECT);
    
    이름과 같이 객체를 빈 객체로 강제 변환하거나 빈 객체로 코딩할 수 있습니다.
    php map1.php
    {}
    

    트랩 2


    그러나 이 방법은 결점이 있다.
    다차원 구조일 때도 모든 구조를 대상으로 한다.
    map_trap2.php
    <?php
    
    $map = [
        'even' => [0, 2, 4, 6, 8,],
        'odd' => [1, 3, 5, 7, 9,],
        'prime' => [2, 3, 5, 7,],
    ];
    
    echo json_encode($map, JSON_FORCE_OBJECT);
    
    배열로 인코딩할 부분도 객체로 인코딩됩니다.
    php map_trap2.php
    {"even":{"0":0,"1":2,"2":4,"3":6,"4":8},"odd":{"0":1,"1":3,"2":5,"3":7,"4":9},"prime":{"0":2,"1":3,"2":5,"3":7}}
    

    해결 방법2


    이것에 대한 근본적인 해결 방법은 없다[1]. 빈 배열 인코딩만 빈 대상으로 하고 싶다면 빈 stdClass()를 사용할 수 있다.
    map2.php
    <?php
    
    $map = [
        'even' => [0, 2, 4, 6, 8,],
        'odd' => [1, 3, 5, 7, 9,],
        'prime' => [2, 3, 5, 7,],
    ];
    
    echo json_encode($map);
    
    // キーがfibonacciの要素のみを選択。結果は空配列となる。
    $filtered_map = array_filter($map, function ($key) {
        return $key === 'fibonacci';
    }, ARRAY_FILTER_USE_KEY);
    
    if (empty($filtered_map)) {
        // エンコードするときに空オブジェクトとなる
        $filtered_map = new stdClass();
    }
    
    echo json_encode($filtered_map);
    
    stdClass() 필드에 값을 입력하지 않으면 빈 객체로 인코딩됩니다.
    php map2.php
    {"even":[0,2,4,6,8],"odd":[1,3,5,7,9],"prime":[2,3,5,7]}
    {}
    
    번거롭지만 다음과 같은 방법은 타협안이라고 생각합니다.
  • 다차원 구조가 아닌 경우(배열 등을 넣지 않는 수평으로 알 수 있음) JSON_FORCE_OBJECT 옵션
  • 다차원 구조의 경우 array_filter 등 처리를 통해 비워질 수 있는 연상 배열을 처리할 때 대입[2],stdClass()의 지점
  • 을 미리 설정한다.
    PHP의'배열과 연상 배열이 같은 문법'이라는 세계관은 지금까지는 그리 어렵지 않았지만, 코딩 등을 다른 포맷으로 변환하는 데는 무리가 느껴졌다.
    각주
    있으면 저도 알고 싶어요. 알려주세요.↩︎
    array_filter 나쁜 사람으로 착각할 수도 있지만 array_diff 또는unset도 있다.단지 예일 뿐이다.↩︎

    좋은 웹페이지 즐겨찾기