PHP:array_values + json_encode返回“奇怪”字符串

时间:2013-11-06 15:53:00

标签: php arrays json numeric

当使用函数array_values以数字方式索引数组时,我遇到了一个奇怪的问题,而不是将其编码为JSON。这是我的脚本如何运作的快速解释。首先,它通过数据库中的查询获取数据并打印出以下内容:

例如:

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来累加总值,因为在拉取数据后会分配direct,internal和external标签;所以请不要建议。

然后,我将array_values()应用于返回的已过滤数组,给我这个:

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

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

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

)

到目前为止一切都很好。但是,当我使用json_encode将数组转换为JSON时,它返回以下字符串:

[{"label":"Direct","value":"1445"},{"label":"Internal","value":9},{"label":"External","value":"1"}]
乍一看,它看起来很完美。但是,如果仔细观察,则值9不是引号,而值1445和1是。我需要值9也用引号。

我注意到的问题很可能在于函数删除重复项并将值加起来,因为内部是唯一一个在原始数组中重复的内容。

完整代码:

//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);

1 个答案:

答案 0 :(得分:1)

  

我注意到的问题很可能在于删除重复项并将值相加的函数,因为内部是唯一一个在原始数组中有重复项的内容。

是。这就是问题所在。从数据库获取值时,它们通常是字符串。所以,你的value都是字符串。 (注意:使用var_dump进行调试,它会显示您的值的类型。)

添加时,它们会转换为整数('1'+'2' = 3)。所以,这就是为什么9不是引号,而是其他的。