Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/239.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 以数字字符串为键的json细枝合并_Php_Json_Symfony_Merge_Twig - Fatal编程技术网

Php 以数字字符串为键的json细枝合并

Php 以数字字符串为键的json细枝合并,php,json,symfony,merge,twig,Php,Json,Symfony,Merge,Twig,我正在尝试将散列与细枝合并以输出JSON 我的问题是,我的一些键使用了数字字符串,twig将其转换为整数 我的代码: {% set rows = {} %} {% for key, val in row %} {% set rows = rows|merge({ (key) : val }) %} {% endfor %} {{ { 'report': { 'metric': metric, 'rows': rows, 'tot': tot, 'min': min, 'max': max

我正在尝试将散列与细枝合并以输出JSON

我的问题是,我的一些键使用了数字字符串,twig将其转换为整数

我的代码:

{% set rows = {} %}
{% for key, val in row %}
    {% set rows = rows|merge({ (key) : val }) %}
{% endfor %}
{{ { 'report': { 'metric': metric, 'rows': rows, 'tot': tot, 'min': min, 'max': max } }|json_encode|raw }}
哪个输出

{"report":{"metric":"sessions","rows":["5","4","4","3","7","4","4"],"tot":"31","min":"0","max":"7"}}
我还尝试用number_格式替换我的键,但由于我剥离了所有非数字字符,所以输出是相同的

{% set rows = {} %}
{% for key, val in row %}
    {% set rows = rows|merge({ (key)|number_format(0,'','') : val }) %}
{% endfor %}
{{ { 'report': { 'metric': metric, 'rows': rows, 'tot': tot, 'min': min, 'max': max } }|json_encode|raw }}
预期结果如下:

{"report":{"metric":"sessions","rows":{"20180423":"5","20180424":"4","20180425":"4","20180426":"3","20180427":"7","20180428":"4","20180429":"4"},"tot":"31","min":"0","max":"7"}}
有什么方法可以阻止Twig将我的键更改为整数吗

找到了这篇文章,但它不适用于我,因为我的键是数字串。
Twig的
merge
过滤器依赖于PHP的
array\u merge
函数,并表示:

带有数字键的输入数组中的值将用 在结果数组中从零开始递增键

仅包含数字的字符串被视为数字

解决方案: 最简单的解决方案是将密钥格式从
“20180423”
更改为
“2018-04-23”
,这将使其非数字


如果确实需要保留数字键,则可以按所需方式合并数组:

namespace App\Twig;

use Twig\Extension\AbstractExtension;
use Twig\TwigFilter;

class AppExtension extends AbstractExtension
{
    public function getFilters()
    {
        return array(
            new TwigFilter('mymerge', array($this, 'merge')),
        );
    }

    public function merge($baseArray, $arrayToMerge)
    {
        foreach ($arrayToMerge as $key => $value) {
            $baseArray[$key] = $value;
        }

        return $baseArray;
    }
}
然后

将输出

{“报告”:{“行”:{“测试”:“1”、“1234”:“2”、“2345”:“3”}


工作起来很有魅力!非常感谢。
{% set test = {"1234": "2", "2345": "3"} %}
{% set rows = {"test": "1"} %}
{% set rows = rows|mymerge(test) %}
{{ { 'report': { 'rows': rows } }|json_encode|raw }}