Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:array#u值+;json“U编码返回”;“奇怪”;一串_Php_Arrays_Json_Numeric - Fatal编程技术网

PHP:array#u值+;json“U编码返回”;“奇怪”;一串

PHP:array#u值+;json“U编码返回”;“奇怪”;一串,php,arrays,json,numeric,Php,Arrays,Json,Numeric,当使用函数array_值对数组进行数字索引,然后将其编码为JSON时,我遇到了一个奇怪的问题。下面是我的脚本如何运行的简要说明。首先,它通过查询从数据库中获取数据,并打印出以下内容: 例如: 使用此函数后,我将删除任何重复的标签,并对值求和 $sources = array(); foreach($data as $key => $values) { if(array_key_exists($values['label'], $sources)) { $

当使用函数array_值对数组进行数字索引,然后将其编码为JSON时,我遇到了一个奇怪的问题。下面是我的脚本如何运行的简要说明。首先,它通过查询从数据库中获取数据,并打印出以下内容:

例如:

使用此函数后,我将删除任何重复的标签,并对值求和

$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也在引号中

我注意到的是,问题很可能存在于函数中,该函数删除重复项并对值求和,因为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);
我注意到的是,问题很可能存在于函数中,该函数删除重复项并对值求和,因为内部是原始数组中唯一具有重复项的函数

对。这就是问题所在。从数据库中获取值时,它们通常是字符串。因此,您的
都是字符串。(注意:使用
var\u dump
进行调试,它将显示值的类型。)


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

您能给我们看一下您的
json\u encode()
调用吗?在返回分配给$sources的数组的函数之后,我有以下内容:$sources=array\u value($sources);echo json_编码($sources);如果您使用var_dump而不是print_r,您可以看到有关数据类型的更多信息我如何将它们转换回字符串?数字也是有效的JSON,因此JSON并不错误。根据值的使用方式,可能会导致问题。如果要转换为字符串,需要遍历所有…['value']并将其更改为字符串。您可以尝试…['value']=strval(…['value'])@BobJansen:您必须在数组上循环并将它们转换回:
foreach($sources as&$val){$val['value']=“{$val['value']}”;}
。没有办法自动做到这一点。有
JSON\u NUMERIC\u CHECK
JSON\u encode($sources,JSON\u NUMERIC\u CHECK);
),但这与您想要的正好相反。这将把字符串转换成数字@RocketHazmat感谢您的投入!现在工作得很好,今天学到了一些新东西。然而,我还有一个问题:使用JSON_NUMERIC_CHECK将比在每个数组中循环要快得多,即使循环最多3次?
//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);