【问题标题】:Twig merge for json with string of numbers as key以数字字符串为键的 json 的 Twig 合并
【发布时间】:2018-10-09 18:37:04
【问题描述】:

我正在尝试将哈希与 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_encode|raw }}

哪些输出

{"report":{"metric":"sessions","rows":["5","4","4","3","7","4","4"],"tot":"31","min":"0","max":"7"}}

我也尝试用 number_format 替换我的键,但由于我要剥离所有非数字字符,所以输出是相同的。

{% 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 将我的键更改为整数?

找到这篇文章,但它对我不起作用,因为我的键是数字字符串。 key value being replaced by 'key' when using merge() in twig

【问题讨论】:

    标签: php json symfony merge twig


    【解决方案1】:

    Twig 的 merge 过滤器依赖于 PHP 的 array_merge 函数,the doc 表示:

    输入数组中带有数字键的值将重新编号为 在结果数组中从零开始递增键。

    并且只包含数字的字符串被认为是数字。

    解决方案:

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


    如果您确实需要保留数字键,可以create a custom filter 以您想要的方式合并数组:

    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;
        }
    }
    

    然后

    {% set test = {"1234": "2", "2345": "3"} %}
    {% set rows = {"test": "1"} %}
    {% set rows = rows|mymerge(test) %}
    {{ { 'report': { 'rows': rows } }|json_encode|raw }}
    

    会输出

    {"report":{"rows":{"test":"1","1234":"2","2345":"3"}}}

    【讨论】:

    • 像魅力一样工作!谢谢!
    猜你喜欢
    • 2022-12-08
    • 2018-04-27
    • 2015-12-13
    • 2016-05-20
    • 2019-06-11
    • 2014-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多