2012-11-23 33 views
15

Tôi đang cố gắng để vẽ (với Flot) một biểu đồ pie với một số dữ liệuLàm thế nào để json_encode mảng php nhưng các phím mà không có dấu ngoặc kép

var data = <?php echo json_encode($data)?> 

Kết quả tôi nhận được từ đó là:

var data = [ 
{"label":"Crear Usuario", "data":"2"}, 
{"label":"Impresoras", "data":"1"}, 
{"label":"Problema Correo", "data":"1"}, 
{"label":"Requisicion Equipo", "data":"1"}, 
{"label":"Sitio Web", "data":"1"} 
] 

Vấn đề ở đây là tôi cần labeldata không có dấu ngoặc kép, tôi đã thử json_encode($data, JSON_NUMERIC_CHECK); nhưng chỉ xóa dấu ngoặc kép khỏi các số.

Định dạng sau đây là những gì tôi cần:

var data = [ 
    {label:"Crear Usuario",data:2}, ... 
+0

Bạn có muốn chuyển đổi này bằng php không? –

+0

Vâng, tôi nghĩ việc chuyển đổi sẽ tốt hơn trong PHP, vâng. – Danny

+2

Tại sao bạn muốn nó mà không có dấu ngoặc kép?, có hoặc không có dấu ngoặc kép là tương đương (mặc dù không có dấu ngoặc kép của nó không phải là JSON). – Musa

Trả lời

11

Trước tiên, bạn phải tạo mảng trong php như vậy giá trị của dữ liệu là các số nguyên, không dây:

tôi mô phỏng mảng của bạn từ json_encode của bạn(), tôi đoán nó trông như thế này (hoặc quảng cáo phải):

$array = array(
       array("label" => "Crear Usuario", "data" => 2), 
       array("label" => "Impresoras",  "data" => 1), 
       array("label" => "Problema Correo", "data" => 1), 
       array("label" => "Requisicion Equipo", "data" => 1), 
       array("label" => "Sitio Web", "data" => 1) 
      ); 

    $data = json_encode($array); 
  • Chú ý rằng 2 và 1 là không thể viện chứng, vì vậy cách này, họ là các số nguyên, điều này là rất quan trọng.

Sau đó, bạn đang missin trong Javascript các JSON.parse() để thực sự làm cho sản lượng đó vào một đối tượng json:

<script> 
    var data = '<?php echo $data; ?>'; 
    var json = JSON.parse(data); 
    console.log(json); 
    console.log(json[0]); 
</script> 
  • ý rằng var data = ... là SINGLE trích dẫn , vì vậy bạn nắm bắt những tiếng vang từ php như một string

các console.log() 's đầu ra này cho tôi:

[Object, Object, Object, Object, Object] // First console.log(): one object with the 5 Objects. 
Object {label: "Crear Usuario", data: 2} // secons console log (json[0]) with the first object 

Có vẻ như những gì bạn cần, tôi có đúng không?

+0

+1 :) Cảm ơn rất nhiều: P –

+0

Đã làm việc cho tôi, cảm ơn! – MrNorm

+0

Chỉ dữ liệu 'var data = ; '(các trích dẫn đơn đã loại bỏ) sẽ thực hiện chính xác điều tương tự - mà không cần phải phân tích cú pháp phía khách hàng –

3

Hãy thử một cái gì đó như thế này:

function buildBrokenJson(array $data) { 

    $result = '{'; 

    $separator = ''; 
    foreach($data as $key=>$val) { 
     $result .= $separator . $key . ':'; 

     if(is_int($val)) { 
     $result .= $val; 
     } elseif(is_string($val)) { 
     $result .= '"' . str_replace('"', '\"', $val) . '"'; 
     } elseif(is_bool($val)) { 
     $result .= $val ? 'true' : 'false'; 
     } else { 
     $result .= $val; 
     } 

     $separator = ', '; 
    } 

    $result .= '}'; 

    return $result; 
} 

và khi chạy

$a = array("string"=>'Crear "Usuario', 'foo'=>':', "int"=>2, "bool"=>false); 
var_dump(buildBrokenJson($a)); 

nó mang lại:

string(54) "{string:"Crear \"Usuario", foo:":", int:2, bool:false}" 
+0

Tôi muốn từ "nhãn" không có dấu ngoặc kép, cũng như cho "dữ liệu". – Danny

+0

đây là loại chuỗi. sẽ được trích dẫn. bạn có thể viết json_encode của riêng mình - không nên khó (ngay bây giờ tôi đang gọi điện thoại) –

+0

xem câu trả lời đã chỉnh sửa –

4

Không có sự khác biệt giữa các khóa được trích dẫn và không được trích dẫn. Vấn đề là với trích dẫn xung quanh các giá trị dữ liệu thực tế, vì Flot yêu cầu số, không phải là chuỗi.

Hàm json_encode quyết định có báo giá dựa trên loại dữ liệu bạn đang cung cấp hay không. Trong trường hợp này, có vẻ như bất kỳ thao tác nào bạn đang thực hiện để tạo ra dữ liệu $ đều tạo ra các giá trị chuỗi thay vì các số nguyên. Bạn cần phải kiểm tra lại các hoạt động đó, hoặc nói rõ với PHP để diễn giải chúng dưới dạng các số, sử dụng phép đúc (int) hoặc (float) hoặc các hàm intval/floatval.

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