json_encode 스파 스 PHP 배열을 JSON 객체가 아닌 JSON 배열로 사용


119

PHP에 다음 배열이 있습니다.

Array
(
    [0] => Array
        (
            [id] => 0
            [name] => name1
            [short_name] => n1
        )

    [2] => Array
        (
            [id] => 2
            [name] => name2
            [short_name] => n2
        )
)

JSON 배열로 JSON 인코딩하여 다음과 같은 문자열을 생성하고 싶습니다.

[  
    {  
        "id":0,
        "name":"name1",
        "short_name":"n1"
    },
    {  
        "id":2,
        "name":"name2",
        "short_name":"n2"
    }
]

그러나이 json_encode배열을 호출 하면 다음을 얻습니다.

{  
    "0":{  
        "id":0,
        "name":"name1",
        "short_name":"n1"
    },
    "2":{  
        "id":2,
        "name":"name2",
        "short_name":"n2"
    }
}

배열이 아닌 객체입니다.

json_encode대신 내 배열을 배열로 인코딩하려면 어떻게 해야합니까?

답변:


194

배열이 순차적이 아니기 때문에이 동작을 관찰하고 있습니다. 배열에는 0및 키가 2있지만 키 는 없습니다 1.

숫자 인덱스만으로는 충분하지 않습니다. json_encodePHP 배열이 순차적 인 경우, 즉 키가 0, 1, 2, 3, ... 인 경우에만 PHP 배열을 JSON 배열로 인코딩합니다.

array_values원하는 동작을 얻기 위해 함수를 사용하여 배열을 순차적으로 다시 인덱싱 할 수 있습니다 . 예를 들어 아래 코드는 사용 사례에서 성공적으로 작동합니다.

echo json_encode(array_values($input)).

4
하지만 열쇠 0,2가 중요 하다면 ? 배열을 다시 색인화 할 수없는 동일한 상황에 있습니다.
shyammakwana.me

2
JSON은 연관 배열을 지원하지 않습니다. 참조 : tools.ietf.org/html/rfc7159#section-5
Nguyen Van Vinh

74

Arrayin JSON은 인덱스 배열 전용 이므로 얻으려는 구조가 유효한 Json / Javascript가 아닙니다.

PHP Associatives 배열은 JSON의 객체이므로 인덱스가 필요하지 않으면 이러한 변환을 수행 할 수 없습니다.

이러한 구조를 얻으려면 다음을 수행 할 수 있습니다.

$indexedOnly = array();

foreach ($associative as $row) {
    $indexedOnly[] = array_values($row);
}

json_encode($indexedOnly);

다음과 같은 결과를 반환합니다.

[
     [0, "name1", "n1"],
     [1, "name2", "n2"],
]

1
나에게 색인 배열의 단서를 주셔서 감사합니다 :) 문제는 ID가 순차 ID 대신 배열의 ID이기도하고 json_encode가 배열로 선택하지 않은 방식으로 색인화했지만 배열이 순차가 아니기 때문에 개체 대신 모든 도움을 주셔서 감사합니다. :)

사실이 아니다. 일부 라이브러리는 연관 배열을 요소 속성 중 하나로 인덱스가있는 배열로 인코딩합니다.
Gustavo

나는 당신이 의미하는 바를 이해하지 못합니다-Martin의 대답에있는 배열은 색인화되지 않았으며 유효한 JSON입니다.
그리고 마지막으로

@AndFinally, Martin의 대답의 배열 실제로 암시 적으로 색인화됩니다. 인덱스를 생략하면 인덱스 배열이 0부터 시작됩니다.
Boris Guéry 2015

이 답변은 질문을 게시했을 때 OP가 원하는 것을 제공하지 않았으며 (당연히 OP가 원하는 것이 불가능했기 때문에), 그 이후로 편집 한 결과이 답변은 현재 상태를 감안할 때 매우 잘못된 것처럼 보입니다. 질문. 이 답변은 수락되었으므로 삭제할 수 없지만 중재자가 삭제하도록 플래그를 지정 하시겠습니까? 5 개 이상의 찬성표가 있으므로 담당자를 유지합니다.
Mark Amery 2015

0

json_decode ($ jsondata, true);

true 는 모든 속성을 배열로 바꿉니다 (순차적이든 아니든)


OP가 묻는 질문과 관련이 없습니다. 영업 이익은 특별히 사용하여 발생하는 문제를 인코딩 요청json_encode
pg2286을

이것이 어떻게 관련이 없습니까? 이것은 json_encode를 사용하여 데이터를 읽을 수있는 배열로 변환하는 예제를 보여줍니다. OP의 질문은 "내 배열을 배열로 인코딩하기 위해 json_encode를 얻으려면 어떻게해야합니까?"입니다. 내 코드가 바로 그런 역할을합니다. "인코딩"이라는 단어가 당신을 반갑게 만드는 것 같아요? '인코딩'은 '전환하다'를 의미합니다. 그것은 반대표를 던지는 이유가 아닙니다.
Robert Sinclair

오, 나는 이것이 당신이 의도하는 것이 옳지 만 약간 바람이 부는 해결책처럼 보였다면 $serialized = json_encode($nonContiguousArray); $unserialize = json_decode($serialized, true); 마침내 이와 같은 것을 추천 할 것이라는 점을 finallySerializedInArrayFormat = json_encode($unserialize);알았습니다.
pg2286

-1

이 시도,

<?php
$arr1=array('result1'=>'abcd','result2'=>'efg'); 
$arr2=array('result1'=>'hijk','result2'=>'lmn'); 
$arr3=array($arr1,$arr2); 
print (json_encode($arr3)); 
?>

이것은 OP가 요구하는 문제를 해결하지 못합니다.
pg2286
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.