树枝中的动态多维数组

Dynamic multidimensional array in twig

我有一个数组,但我需要重组它。我只能在树枝上这样做。

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

"_id" => array:3 [
"cityName" => "someCityName"
"id" => 111
"className" => "someClassName"
  ]
"count" => 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):([])}) %}

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

.

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

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