문제

나는 간단한 배열을 가지고 있습니다 :

array
  0 => string 'Kum' (length=3)
  1 => string 'Kumpel' (length=6)

json_encode()를 사용하여 배열을 인코딩하면 다음과 같은 결과가 나타납니다.

["Kum","Kumpel"] 

내 질문은, 얻는 이유가 무엇입니까? ["Kum","Kumpel"] 대신에 { "0" : "Kum", "1" : "Kumpel" }?

도움이 되었습니까?

해결책

"{}"브래킷은 객체를 지정하고 []는 JSON 사양에 따라 배열에 사용됩니다. 메모리 할당 관점에서 배열이 열거되어 있지 않습니다. 더 많은 데이터와 더 많은 데이터 일뿐입니다. 다른 핸드의 객체는 이름이있는 속성이 있고 데이터가 속성에 할당되므로 그러한 객체를 인코딩하려면 올바른 속성 이름을 전달해야합니다. 그러나 배열의 경우 인덱스를 지정할 필요가 없습니다. 항상 0..N이기 때문에 N은 배열의 길이 -1이므로 중요한 것은 데이터 순서입니다.

$array = array("a","b","c");
json_encode($array); // ["a","b","c"]
json_encode($array, JSON_FORCE_OBJECT); // {"0":"a", "1":"b","2":"c"}

JSON_FORCE_OBJECT "0,1,2"를 사용하는 데 중점을 둔 이유는 개발자가 속성 이름이 제공되지 않기 때문에 (데이터 만) 배열 인덱스를 속성으로 사용하는 속성 이름이 없으므로 속성에 할당해야하기 때문입니다. 이름은 의미가있는 유일한 이름이기 때문입니다.

참고 :에 따르면 PHP 매뉴얼 옵션 매개 변수는 PHP 5.3에서만 사용할 수 있습니다.

이전 PHP 버전의 경우 json_encode가 인덱스를 사용하도록하는 방법에 대한 Chelmertz의 답변을 참조하십시오.

다른 팁

Gumbo가 말했듯이 JS 측에서는 중요하지 않습니다. PHP를 강제하려면 이것을 시도하십시오.

$a = new stdClass();
$a->{0} = "Kum";
$a->{1} = "Kumpel";
echo json_encode($a);

사용하기 어려운 것은 아니며, 배열 표기법을 고수했습니다.

객체로 캐스트하면 잘 작동합니다 ... JSON_FORCE_OBJECT 매개 변수는 정확히 같은 작업을 수행합니다.

json_encode((object)$array);

PHP에서 값에 액세스 할 수 있도록 PHP 배열로 다시 변환하는 것을 잊지 마십시오.

$array = (object)$array;
$array = (array)$array;

json_encode($array);

숫자 키가있는 PHP 배열이 있으므로 JavaScript 객체를 사용할 필요가 없습니다. 그러나 필요한 경우 Maiku Mori의 제안을 시도하십시오.

개인적으로 이것은 PHP에서 수정되어야 할 버그라고 생각합니다.JSON_FORCE_OBJECT는 절대 답이 아닙니다.어떤 종류의 일반 프로그래밍을 하려고 하면 계속해서 문제가 발생합니다.예를 들어 다음은 유효한 PHP입니다.

배열("0" => 배열(0,1,2,3), "1" => 배열(4,5,6,7));

그리고 다음과 같이 변환되어야 합니다.

{"0": [0,1,2,3], "1": [4,5,6,7]}

그러나 PHP는 내가 수락하기를 기대합니다.

[[0,1,2,3],[4,5,6,7]]

또는

{"0":{"0":1,"1":1,"2":2,"3":3},"1":{"0":4,"1":5,"2":6,"3":7}}

어느 쪽도 전혀 옳지 않습니다.그런 객체를 어떻게 해독할 수 있나요?문자열을 인덱스로 사용하는 것이 명확하게 변경되는 이유는 무엇입니까?마치 PHP가 문자열과 정수를 구별할 수 없는 멍청한 사람들을 돕기 위해 영리하게 노력했지만 그 과정에서 값이 어떻게 변환될지에 관계없이 문자열을 인덱스로 합법적으로 사용하는 사람을 엉망으로 만든 것과 같습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top