树枝中的动态多维数组
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 #}
我有一个数组,但我需要重组它。我只能在树枝上这样做。
原始数组元素看起来像 $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 #}