使用函数 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 对总值进行求和,因为标签直接、内部和外部是在提取数据后分配的;所以请不要建议。
然后,我将 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 也在引号中。
我注意到的问题很可能在于删除重复项并将值相加的函数,因为 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);