当使用函数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);
答案 0 :(得分:1)
我注意到的问题很可能在于删除重复项并将值相加的函数,因为内部是唯一一个在原始数组中有重复项的内容。
是。这就是问题所在。从数据库获取值时,它们通常是字符串。所以,你的value
都是字符串。 (注意:使用var_dump
进行调试,它会显示您的值的类型。)
添加时,它们会转换为整数('1'+'2' = 3
)。所以,这就是为什么9
不是引号,而是其他的。