2

使用函数 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);
4

1 回答 1

1

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

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

当您进行加法时,它们将转换为整数 ( '1'+'2' = 3)。所以,这就是为什么9不在引号中,而在其他引号中。

于 2013-11-06T15:57:43.567 回答