树枝中的动态多维数组 [英] Dynamic multidimensional array in twig

查看:26
本文介绍了树枝中的动态多维数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个数组,但我需要重构它.我只能在树枝上做到这一点.

原始数组元素看起来像$arr[0]:

"_id" =>数组:3 [城市名称" =>某个城市名称"身份证"=>111类名"=>某个类名"]计数" =>85

我的结果数组元素应该看起来像 $arr[0]:

"someCityName" =>[12 =>[someClassName" =>32,someOtherClassName" =>44]]

在php中我会做

$arr[$cityName][$id][$className] = $count;

这行得通,但必须在树枝中完成.

我希望使用树枝合并,但是当我尝试这样做时

{% for infoArr in result %}{% set cityName = infoArr['_id']['cityName'] %}{% set id = infoArr['_id']['id'] %}{% set class = infoArr['_id']['className'] %}{% set countCity.cityName = countCity.cityName|merge({(id):([])}) %}

{% endfor %}

{% set countCity[cityName] = countCity[cityName]|merge({(id):([])}) %}

<块引用>

错误是值["的意外标记标点符号"(结束语句块"预期)

.

这应该如何在 twig 中正确完成?

解决方案

如果你想在 twig 中做这样的事情,我鼓励,你需要重建数组的每个部分.另请注意,您不能将 merge 与数字 indeces 一起使用,否则数据将被附加,而不是被覆盖.有关此问题的更多信息此处

$data = ['数据' =>[['_id' =>['城市名称' =>'富','类名' =>'α','id' =>42,],'计数' =>40,],['_id' =>['城市名称' =>'酒吧','类名' =>'α','id' =>55,],'计数' =>123,],['_id' =>['城市名称' =>'富','类名' =>'测试版','id' =>42,],'计数' =>99,],],];

<小时>

{% set output = {} %}{% for raw in data %}{% if not attribute(output, raw._id.cityName) 被定义 %}{% set output = output|merge({ (raw._id.cityName) : {}, }) %}{% 万一 %}{% 如果没有定义属性(output[raw._id.cityName], 'id_'~raw._id.id) %}{% set output = output|merge({(raw._id.cityName) : output[raw._id.cityName] | merge({('id_'~raw._id.id):[], }) }) %}{% 万一 %}{% set output = output|merge({(raw._id.cityName) : output[raw._id.cityName] | merge({('id_'~raw._id.id): output[raw._id.cityName]['id_'~raw._id.id]|merge({(raw._id.className): raw.count}), }) }) %}{% 结束为 %}{{ output.foo.id_42.alpha }} {# 输出:40 #}

演示

I have an array, but I need to restructure it. I can only do this in twig.

Original array element looks like $arr[0]:

"_id" => array:3 [
"cityName" => "someCityName"
"id" => 111
"className" => "someClassName"
  ]
"count" => 85

my result array element should look like $arr[0]:

"someCityName" => [
    12 => [
        "someClassName" => 32,
        "someOtherClassName" => 44
    ]
]

in php I would just do

$arr[$cityName][$id][$className] = $count;

And this would work, but this must be done in twig.

I was hoping to use twig merge, but when I try doing

{% for infoArr in result %}
{% set cityName = infoArr['_id']['cityName'] %}
{% set id = infoArr['_id']['id'] %}
{% set class = infoArr['_id']['className'] %}
{% set countCity.cityName = countCity.cityName|merge({(id):([])}) %}    

{% endfor %}

or

{% set countCity[cityName] = countCity[cityName]|merge({(id):([])}) %}

the error is Unexpected token "punctuation" of value "[" ("end of statement block" expected)

.

How should this be done in twig correctly?

解决方案

If you wanted to do something like this in twig, which I'm not encouraging, you need to reconstruct every part of the array. Also note you can't use merge with numeric indeces, otherwise the data will be appended, not overwritten. More information on this issue here

$data = [
    'data' => [
        [
            '_id' => [
                'cityName'  => 'foo',
                'className' => 'alpha',
                'id'        => 42,
            ],
            'count' => 40,
        ],
        [
            '_id' => [
                'cityName'  => 'bar',
                'className' => 'alpha',
                'id'        => 55,
            ],
            'count' => 123,
        ],
        [
            '_id' => [
                'cityName'  => 'foo',
                'className' => 'beta',
                'id'        => 42,
            ],
            'count' => 99,
        ],
    ],
];


{% set output = {} %}

{% for raw in data %}
    {% if not attribute(output, raw._id.cityName) is defined %}
        {% set output = output|merge({ (raw._id.cityName) : {}, }) %}
    {% endif %}

    {% if not attribute(output[raw._id.cityName], 'id_'~raw._id.id) is defined %}
        {% set output = output|merge({(raw._id.cityName) : output[raw._id.cityName] | merge({('id_'~raw._id.id):[], }) }) %}
    {% endif %}

    {% set output = output|merge({(raw._id.cityName) : output[raw._id.cityName] | merge({('id_'~raw._id.id): output[raw._id.cityName]['id_'~raw._id.id]|merge({(raw._id.className): raw.count}), }) }) %}
{% endfor %}


{{ output.foo.id_42.alpha }} {# output: 40 #}

demo

这篇关于树枝中的动态多维数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆