[PHP 입문] 제이슨encode에서 그룹 대상으로 명확하게 인코딩하기
총결산
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
에서 키 유지해결책
이를 해결하는 방법으로는 일반적으로
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
도 있다.단지 예일 뿐이다.↩︎ Reference
이 문제에 관하여([PHP 입문] 제이슨encode에서 그룹 대상으로 명확하게 인코딩하기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/kumackey/articles/06b87040c5374d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)