2009-03-26 36 views
8

Tôi đang cố gắng json_encode một mảng được trả về từ một truy vấn Zend_DB.Làm cách nào để mã hóa một mảng PHP thành một mảng JSON, không phải đối tượng?

var_dump cho: (Manually thêm 0 thành viên không làm thay đổi hình ảnh.)

array(3) { 
    [1]=> 
    array(3) { 
    ["comment_id"]=> 
    string(1) "1" 
    ["erasable"]=> 
    string(1) "1" 
    ["comment"]=> 
    string(6) "test 1" 
    } 
    [2]=> 
    array(3) { 
    ["comment_id"]=> 
    string(1) "2" 
    ["erasable"]=> 
    string(1) "1" 
    ["comment"]=> 
    string(6) "test 1" 
    } 
    [3]=> 
    array(3) { 
    ["comment_id"]=> 
    string(1) "3" 
    ["erasable"]=> 
    string(1) "1" 
    ["comment"]=> 
    string(6) "jhghjg" 
    } 
} 

Chuỗi mã hóa trông giống như:

{"1":{"comment_id":"1","erasable":"1","comment":"test 1"}, 
"2":{"comment_id":"2","erasable":"1","comment":"test 1"}, 
"3":{"comment_id":"3","erasable":"1","comment":"jhghjg"}} 

Những gì tôi cần là:

[{"comment_id":"1","erasable":"1","comment":"test 1"}, 
{"comment_id":"2","erasable":"1","comment":"test 1"}, 
{"comment_id":"3","erasable":"1","comment":"jhghjg"}] 

Tài liệu php.ini/json_encode nói là gì.

Trả lời

12

Bạn thiết lập mảng ban đầu như thế nào?

Nếu bạn thiết lập nó như:

array(
"1" => array(...), 
"2" => array(...), 
); 

sau đó bạn không có một mảng với chỉ số số nhưng chuỗi, và đó là chuyển đổi sang một đối tượng trong thế giới JS. Điều này cũng có thể xảy ra nếu bạn không đặt thứ tự nghiêm ngặt (tức là bắt đầu từ 0 thay vì 1).

Đây là một shot trong bóng tối, tuy nhiên, vì tôi không thể xem mã ban đầu của bạn: cố gắng thiết lập mảng của bạn mà không sử dụng các phím ở tất cả ở nơi đầu tiên:

array(
array(...), 
array(...), 
); 
+2

+1 # mảng không bắt đầu bằng 0 cho khóa của nó không phải là mảng. lỗi phps mặc dù có một lovechild khốn kỳ lạ của mảng/băm hoạt động đúng như không. –

+0

Mã là thứ trả về dưới dạng kết quả truy vấn Zend_DB –

+0

Như tôi đã nói, điều đó không làm cho nó trở thành một mảng, làm cho nó trở thành một băm với khóa số, chỉ * xảy ra * trong trường hợp này gần bằng 0 tại bắt đầu bởi vì đó là những gì dữ liệu trong cơ sở dữ liệu có. –

2

Cách phổ biến để kiểm tra mảng truyền thống, liên tục trong php là kiểm tra chỉ mục '0'. Hãy thử thêm nó vào mảng của bạn, nó có lẽ sẽ xem xét nó một mảng thay vì hashmap.

6

thông tin gia tăng mà mở rộng trên Câu trả lời của Seb.

php > print json_encode(array('a', 'b', 'c')) ; 
["a","b","c"] 
php > print json_encode(array(0 => 'a', 1 => 'b', 2 => 'c')) ; 
["a","b","c"] 
php > print json_encode(array(1 => 'a', 2 => 'b', 3 => 'c')) ; 
{"1":"a","2":"b","3":"c"} 
php > 

Lưu ý: nó định dạng nó theo cách này với lý do chính đáng:

Nếu bạn đã gửi

{"1":"a","2":"b","3":"c"} 

như

["a","b","c"] 

Khi bạn đã làm $data[1] trong Php bạn sẽ lấy lại "a", nhưng ở phía JavaScript, bạn sẽ lấy lại "b".

-3

tôi đã gặp sự cố tương tự, làm cho nó hoạt động sau khi thêm '' (dấu nháy đơn) xung quanh chuỗi json_encode. Theo dõi từ tệp js của tôi:

var myJsVar = <?php echo json_encode($var); ?> ; -------> NOT WORKING 
var myJsVar = '<?php echo json_encode($var); ?>' ; -------> WORKING 
+1

Điều đó hoàn toàn không có ý nghĩa. Nó sẽ mở rộng thành 'var myJsVar = '{" 1 ":" a "....}'' là một chuỗi * *, không phải mảng. Bạn sẽ phải giải mã nó bằng cách nào đó trong JS Land để làm cho nó có thể sử dụng được, hoặc bằng cách chuyển nó đến một trình phân tích cú pháp JSON thích hợp hoặc làm 'myJsVar = eval (myJsVar') ở đâu đó sau này. –

Các vấn đề liên quan