2013-11-06 3 views
2

У меня возникает странная проблема при численном индексировании массива с помощью функции array_values, а не в кодировке JSON. Вот краткое объяснение, как работает мой скрипт. Во-первых, она извлекает данные с помощью запроса из базы данных и выводит следующее из:PHP: array_values ​​+ json_encode возвращает «странную» строку

Eg:

Array 
(
[0] => Array 
    (
     [label] => Direct 
     [value] => 1445 
    ) 

[1] => Array 
    (
     [label] => Internal 
     [value] => 2 
    ) 

[2] => Array 
    (
     [label] => Internal 
     [value] => 2 
    ) 

[3] => Array 
    (
     [label] => Internal 
     [value] => 3 
    ) 

[4] => Array 
    (
     [label] => Internal 
     [value] => 1 
    ) 

[5] => Array 
    (
     [label] => Internal 
     [value] => 1 
    ) 

[6] => Array 
    (
     [label] => External 
     [value] => 1 
    ) 

) 

чем с помощью этой функции я удалить любой дубликат лейбла и суммировать значения.

$sources = array(); 

foreach($data as $key => $values) 
{ 
    if(array_key_exists($values['label'], $sources)) 
    { 
     $sources[$values['label']]['value'] += $values['value']; 
     $sources[$values['label']]['label'] = $values['label']; 
    } 
    else 
    { 
     $sources[$values['label']] = $values; 
    } 
} 

Возвращение этого:

Array 
(
[Direct] => Array 
    (
     [label] => Direct 
     [value] => 1445 
    ) 

[Internal] => Array 
    (
     [label] => Internal 
     [value] => 9 
    ) 

[External] => Array 
    (
     [label] => External 
     [value] => 1 
    ) 

) 

Примечание: Я не могу использовать SQL для подсчитывать общую стоимость как метки прямые, внутренние и внешние назначены после того, как данные вытягивается; поэтому, пожалуйста, не предлагайте это.

Чем я применяю array_values ​​() возвращенный отфильтрованный массив, давая мне это:

Array 
(
[0] => Array 
    (
     [label] => Direct 
     [value] => 1445 
    ) 

[1] => Array 
    (
     [label] => Internal 
     [value] => 9 
    ) 

[2] => Array 
    (
     [label] => External 
     [value] => 1 
    ) 

) 

До сих пор все хорошо. Однако, когда я поворачиваю массив в JSON с json_encode он возвращает следующую строку:

[{"label":"Direct","value":"1445"},{"label":"Internal","value":9},{"label":"External","value":"1"}] 

На первый взгляд она выглядит прекрасно. Однако, если вы внимательно посмотрите, значение 9 не входит в кавычки, тогда как значения 1445 и 1. Мне нужно значение 9 также в кавычках.

То, что я заметил, это проблема, которая, скорее всего, лежит в функции, удаляет дубликаты и суммирует значения вверх, так как Internal является единственным с дубликатами в исходном массиве.

Полный код:

//Add up values of duplicate labels 
$sources = array(); 

foreach($data as $key => $values) 
{ 
    if(array_key_exists($values['label'], $sources)) 
    { 
     $sources[$values['label']]['value'] += $values['value']; 
     $sources[$values['label']]['label'] = $values['label']; 
    } 
    else 
    { 
     $sources[$values['label']] = $values; 
    } 
} 

//Assign numeric values as main key 
$sources = array_values($sources); 


//Print JSON 
echo json_encode($sources); 
+0

Вы можете показать нам свой вызов 'json_encode()'? –

+0

После funtion, который возвращает массив, назначенный источникам $, у меня есть следующее: $ sources = array_values ​​($ sources); echo json_encode ($ sources); –

+1

, если вы используете var_dump вместо print_r, вы можете увидеть дополнительную информацию о типе данных –

ответ

1

Что я сделал уведомление проблема, скорее всего, лежит в той функции, удаляет дубликаты и суммирует значения вверх, а внутренняя является единственным с дубликатами в исходном массиве ,

Да. Это проблема. Когда вы получаете значения из базы данных, они обычно являются строками. Итак, ваши value s - все строки. (ПРИМЕЧАНИЕ. Для отладки используйте var_dump, он покажет вам типы ваших значений.)

Когда вы делаете добавление, они преобразуются в ints ('1'+'2' = 3). Итак, вот почему 9 не в кавычках, а остальные.

+0

Как бы преобразовать их в строки? –

+0

$ var = (строка) $ var; –

+3

Номера также действительны JSON, поэтому JSON неверен. В зависимости от того, как используются значения, это может вызвать проблемы. –

Смежные вопросы