2010-08-24 27 views
9

nhưng theo điều này: http://www.php.net/manual/en/function.json-encode.php#94157 nó sẽ không.Tôi muốn json_encode trong PHP trả về một mảng JSON ngay cả khi các chỉ mục không theo thứ tự

Tôi đang sử dụng flot vì vậy tôi cần phải có một mảng với chỉ số số trở về nhưng những gì tôi nhận được là:

jsonp1282668482872 ({"label":"Hits 2010-08-20","data":{"1281830400":34910,"1281916800":45385,"1282003200":56928,"1282089600":53884,"1282176000":50262,"1281657600":45446,"1281744000":34998}}); 

nên flot là nghẹt thở. Nếu tôi var_dump mảng ngay trước khi tôi gọi json_encode nó trông như thế này:

array(7) { 
    [1281830400]=> 
    int(34910) 
    [1281916800]=> 
    int(45385) 
    [1282003200]=> 
    int(56928) 
    [1282089600]=> 
    int(53884) 
    [1282176000]=> 
    int(50262) 
    [1281657600]=> 
    int(45446) 
    [1281744000]=> 
    int(34998) 
} 

bất kỳ ý tưởng?

+0

Câu hỏi liên quan là http://stackoverflow.com/questions/11195692/json-encode-sparse-php-array-as-json-array-not-json-object –

Trả lời

7

Đó là khái niệm không thể. Bạn không thể mã hóa một mảng với các chỉ mục cố định trong JSON.

Như một lời nhắc nhở, một mảng JSON trông như thế này:

[1, 2, 3, 4, 5] 

Không có chỗ để đưa chỉ số đó.

Bạn nên làm việc ở phía bên Javascript. Chấp nhận rằng json_encode sẽ trả về một đối tượng, bạn có thể chuyển đổi đối tượng này thành một mảng. Điều đó không quá khó.

function toArray(object) 
{ 
    var result = []; 
    for (var key in object) 
    { 
     if (!key.match(/^[0-9]+$/)) throw new Error("Key must be all numeric"); 
     result[parseInt(key)] = object[key]; 
    } 
    return result; 
} 
+0

Tôi nghĩ sẽ có ý nghĩa hơn khi sửa chữa mảng trên PHP-kích thước nếu OP có quyền kiểm soát nó, mà nó âm thanh như họ làm. Đối với một, nó sẽ được nhanh hơn và sẽ dẫn đến (hầu như) ít dữ liệu được gửi cho khách hàng. – pr1001

+0

@ pr1001: bạn sẽ mất tất cả thông tin chính nếu bạn làm.Vì các phím là dấu thời gian, tôi tin rằng chúng quan trọng. – zneak

+0

Tôi đồng ý, nhưng như pkh và tôi đã đăng, tôi nghĩ anh ấy đã nhầm lẫn về định dạng mảng mà anh ấy cần ngay từ đầu. – pr1001

0

Bạn có thể sử dụng array_merge reindex một mảng số lượng được lập chỉ mục, như thế này:

$a = array(2 => 3, 4 => 5); 
$a = array_merge($a); 
var_dump($a); 
+0

Anh ta sẽ mất chìa khóa, và chìa khóa có vẻ quan trọng. – zneak

+0

Trong trường hợp đó, anh ta cần một đối tượng JSON, một mảng sẽ không làm điều này. – Robin

5

Bạn có thể buộc json_decode() để tạo mảng bằng cách thông qua TRUE như tham số thứ hai, nhưng bạn không thể ép buộc json_encode() để sản xuất mảng ở địa điểm đầu tiên:

json_decode($json, TRUE); // force array creation 
24

Như zneak nói, mảng JavaScript (và do đó JSON) không thể có khóa mảng ngoài thứ tự. Vì vậy, bạn có cần phải chấp nhận rằng bạn sẽ được làm việc với các đối tượng JSON, không mảng, hoặc gọi array_values trước json_encode:

json_encode(array_values($data)); 

Tuy nhiên, có vẻ như bạn đang tìm kiếm để hiển thị dữ liệu chuỗi thời gian với flot. Như bạn có thể nhìn thấy trên flot time series example, nó phải là một mảng hai yếu tố như sau:

$.plot(
    $('#placeholder'), 
    [[ 
    [1281830400, 34910], 
    [1281916800, 45385], 
    [1282003200, 56928], 
    [1282089600, 53884], 
    [1282176000, 50262], 
    [1281657600, 45446], 
    [1281744000, 34998] 
    ]], 
    { 
    label: 'Hits 2010-08-20', 
    xaxis: {mode: 'time'} 
    } 
) 

Với mảng của bạn (chúng ta hãy gọi nó $data), chúng tôi có thể nhận được JSON đúng như vậy:

json_encode(
    array_map(
    function($key, $value) { return array($key, $value); }, 
    array_keys($data), 
    array_values($data) 
) 
); 
+0

Thật tuyệt vời, tôi đã đạt được kết quả tương tự bằng cách tạo JSON với vòng lặp nhưng tôi thích giải pháp của bạn tốt hơn. Cảm ơn! –

+0

Rất vui được trợ giúp. Vui lòng đánh dấu nó là câu trả lời nếu bạn cảm thấy rằng nó trả lời câu hỏi của bạn. – pr1001

+0

sau 6 giờ Googleing, bạn đã giải quyết được vấn đề của mình về việc chuẩn bị JSON đúng cách để vẽ đồ thị trong FLOT. CẢM ƠN BẠN! – newyuppie

0

Đối với flot, những gì bạn đang yêu cầu không thực sự là những gì bạn muốn. Bạn muốn một mảng các mảng, không phải là một mảng các số. Tức là, bạn muốn một cái gì đó trông giống như thế này:

[[1281830400, 34910], 
    [1281916800, 45385], 
    [1282003200, 56928], 
    [1282089600, 53884], 
    [1282176000, 50262], 
    [1281657600, 45446], 
    [1281744000, 34998]] 

Về cách làm điều đó trong PHP, tôi không chắc chắn.

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