2013-03-08 35 views
8

Tôi gặp sự cố khi sử dụng json_encode để tạo chuỗi được mã hóa json từ một mảng.Vấn đề json_encode PHP với mảng 0 khóa

Phần của mảng trong câu hỏi trông như thế này

RatingDistribution (Array, 11 elements) 
    0 (Array, 1 element) 
     0 (String, 3 characters) 4.5 
    1 (Array, 1 element) 
     1 (String, 4 characters) 11.9 
    2 (Array, 1 element) 

Nhưng sản xuất này trong chuỗi:

"RatingDistribution":[["4.5"],{"1":"11.9"}, 

tôi sẽ mong đợi điều này:

"RatingDistribution":[{"0":"4.5"},{"1":"11.9"}, 

Tất cả tôi đang làm là:

$result = json_encode($array); 

Tôi đã làm điều gì đó sai hoặc tôi có cần thêm mã để đảm bảo phím 0 có mặt không?

Cheers Andy

+1

bạn có thể post đoạn code php mà bạn nhận được mảng? hoặc print_r mảng? Có vẻ như tìm kiếm của bạn sai. –

+0

Tôi nghĩ rằng nó vít lên trên yếu tố thứ hai (chỉ số 1) bởi vì nó là mảng phụ bắt đầu như 1 và do đó được hiểu là một khóa chuỗi. – TFennis

Trả lời

-1

cou có thể thử để cast phím mảng thành một chuỗi ví dụ với strval hoặc (string).

+1

Điều này sẽ được bình luận! – sandip

+1

Đó là suy nghĩ đầu tiên của tôi nhưng nó không có sự khác biệt, kèm theo nó trong dấu ngoặc kép nhưng nó làm cho json rất lộn xộn :) –

14

Kết quả bạn đang nhận được sẽ được mong đợi; json_encode phát hiện rằng bạn chỉ sử dụng các phím số trong mảng, vì vậy nó dịch thành một mảng thay vì một đối tượng trong JSON. Hầu hết thời gian, đó là chính xác những gì bạn muốn làm.

Nếu vì một số lý do bạn không (? Tại sao), trong PHP> = 5.3 bạn có thể sử dụng JSON_FORCE_OBJECT cờ để có được kết quả mong muốn của bạn:

$result = json_encode($array, JSON_FORCE_OBJECT); 
+0

hành vi là một chút lẻ, ví dụ như giá trị đầu tiên sẽ giải mã vào một mảng mà tất cả các giá trị tiếp theo sẽ là đối tượng . –

+0

Tôi nghi ngờ chúng tôi sẽ phải sử dụng JSON_FORCE_OBJECT –

+0

@ user2147830: Không thực sự lạ IMHO. Khóa đầu tiên của mảng thứ hai không phải là '0', đủ để heuristic quyết định" OK, đây là một mảng kết hợp ". – Jon

1

Nếu bạn muốn sử dụng mảng trong json của bạn sau đó thay vì tham số JSON_FORCE_OBJECT, bạn có thể chỉ đơn giản là đưa mảng vào đối tượng.

Vấn đề:

json_encode([0 => [1,2,3]]); // Return: [[1,2,3]] 
json_encode(["0" => [1,2,3]]); // Return: [[1,2,3]] 
json_encode([1 => [1,2,3]]); // Return: {"1":[1,2,3]} 

Không phải những gì chúng tôi mong đợi:

json_encode([0 => [1,2,3]], JSON_FORCE_OBJECT); // Return: {"0":{"0":1,"1":2,"2":3}} 

Giải pháp:

json_encode((object)[0 => [1,2,3]]); // Return: {"0":[1,2,3]} 
json_encode(new \ArrayObject([0 => [1,2,3]])); // Return: {"0":[1,2,3]} 
Các vấn đề liên quan