Php 以数字字符串为键的json细枝合并
我正在尝试将散列与细枝合并以输出JSON 我的问题是,我的一些键使用了数字字符串,twig将其转换为整数 我的代码: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
{% 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 }}