2012-11-23 10 views
15

Próbuję działki (z Flot) wykres kołowy z niektórych danychJak json_encode tablicy PHP, ale klucze bez cudzysłowów

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

Wynik mam z tego jest taka:

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"} 
] 

Problem polega na tym, że potrzebuję label i data bez cytatów, już próbowałem json_encode($data, JSON_NUMERIC_CHECK);, ale tylko usuwa cytaty z liczb.

Następujący format jest to, czego potrzebuję:

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

Czy chcesz tej konwersji w php? –

+0

Cóż, myślę, że konwersja byłaby lepsza w PHP, tak. – Danny

+2

Dlaczego chcesz tego bez cudzysłowów?, z cudzysłowami lub bez jest równoważne (choć bez cudzysłowów nie jest to JSON). – Musa

Odpowiedz

11

Po pierwsze, trzeba wygenerować tablicę w PHP więc wartość Dane są liczbami całkowitymi, a nie ciągi:

I emulowane swoją tablicę z json_encode(), myślę, że wygląda to tak (lub powinien):

$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); 
  • Zauważ, że 2 i 1 są cytowane, więc w ten sposób, że są liczbami całkowitymi, to jest ważne.

Wtedy jesteś missin w JavaScript JSON.parse(), aby rzeczywiście zrobić to wyjście do obiektu json:

<script> 
    var data = '<?php echo $data; ?>'; 
    var json = JSON.parse(data); 
    console.log(json); 
    console.log(json[0]); 
</script> 
  • Zauważ, że dane var = ... jest Single QUOTED , więc można złapać z php echo jako String

The console.log() 's wyjście to dla mnie:

[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 

Wygląda na to, czego potrzebujesz, czy mam rację?

+0

+1 :) Wielkie dzięki: P –

+0

Pracowałem dla mnie, dzięki! – MrNorm

+0

Tylko 'var data = ; '(usunięto pojedyncze cudzysłowy) zrobiłoby dokładnie to samo - bez potrzeby analizowania po stronie klienta –

3

Spróbuj czegoś takiego:

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; 
} 

i kiedy uruchomić

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

daje:

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

Chcę słowo "etykieta" bez cytatów, a także dla "danych". – Danny

+0

to typ ciągu. będą cytowane. możesz napisać własny json_encode - nie powinien być twardy (jestem teraz na telefonie) –

+0

zobacz poprawioną odpowiedź –

4

Nie ma różnicy między kluczami notowanymi i niecytowanymi. Problem polega na cytowaniu rzeczywistych wartości danych, ponieważ Flot wymaga liczb, a nie ciągów.

Funkcja json_encode decyduje, czy cytować w oparciu o typ danych, które podajesz. W tym przypadku wygląda na to, że jakiekolwiek operacje wykonywane w celu utworzenia danych $ generują wartości łańcuchowe zamiast liczb całkowitych. Musisz ponownie zbadać te operacje lub wyraźnie powiedzieć PHP, aby interpretował je jako liczby, używając (int) lub (float) rzutowania lub funkcji intval/floatval.

Powiązane problemy