Как json_encode php массив, но ключи без кавычек

Я пытаюсь построить (с Flot ) круговую диаграмму с некоторыми данными

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

В результате я получаю следующее:

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

Проблема здесь в том, что мне нужна label и data без кавычек, я уже пробовал json_encode($data, JSON_NUMERIC_CHECK); но удаляет только цитаты из чисел.

Мне нужен следующий формат:

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

Во-первых, вы должны сгенерировать свой массив в php, чтобы значение данных было целым числом, а не строками:

Я эмулировал ваш массив из json_encode (), я думаю, он выглядит так (или он должен):

 $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); 
  • Обратите внимание, что 2 и 1 не сортируются, так что они являются целыми числами, это важно.

Затем вы пропустите в Javascript JSON.parse (), чтобы сделать этот вывод в json-объекте:

 <script> var data = '<?php echo $data; ?>'; var json = JSON.parse(data); console.log(json); console.log(json[0]); </script> 
  • Обратите внимание, что var data = … является SINGLE QUOTED, поэтому вы улавливаете эхо от php как String

Результат console.log () выводит это для меня:

 [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 

Похоже, что вам нужно, правильно?

Нет никакой разницы между цитируемыми и неуказанными ключами. Проблема заключается в цитировании вокруг фактических значений данных, поскольку Флот требует чисел, а не строк.

Функция json_encode решает, следует ли указывать на основе типа данных, которые вы ему даете. В этом случае, похоже, что все операции, которые вы выполняете для создания $ data, производят строковые значения вместо целых чисел. Вам нужно пересмотреть эти операции или явно указать PHP, чтобы интерпретировать их как числа, используя (int) или (float) casting, или функции intval / floatval.

Попробуйте что-то вроде этого:

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

и при запуске

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

это дает:

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