Php 用细枝创建一个数组

Php 用细枝创建一个数组,php,symfony,twig,Php,Symfony,Twig,我用PHP编写了以下代码: $units = array(); foreach ($popPorts as $port) { $units[$port->getFrameNo()][$port->getSlotNo()][$port->getPortNo()] = $port->getPortNo(); } 我怎样才能在细枝上达到同样的效果 到目前为止,我已经尝试过: {% set frames = [] %} {% for row in object.popPorts

我用PHP编写了以下代码:

$units = array();
foreach ($popPorts as $port) {
$units[$port->getFrameNo()][$port->getSlotNo()][$port->getPortNo()] = $port->getPortNo();
}
我怎样才能在细枝上达到同样的效果

到目前为止,我已经尝试过:

{% set frames = [] %}
{% for row in object.popPorts %}
    {% set frames[row.frameNo][row.slotNo][row.portNo] = row.portNo %}
{% endfor %}
{{ dump(frames) }}
但是我得到了一个错误:

值“[”(“语句块结尾”)的意外标记“标点” 预期的)

输出应如下所示:

array (size=3)
  (frame) 1 => 
    array (size=2)
      (slot) 1 =>
        array (size=4)
          0 => (port) 26
          1 => (port) 27
          2 => (port) 28
          3 => (port) 29
      (slot) 5 =>
        array (size=2)
          0 => (port) 31
          1 => (port) 34
  (frame) 2 => 
    array (size=1)
      (slot) 3 =>
        array (size=1)
          0 => (port) 32
  (frame) 3 => 
    array (size=1)
      (slot) 6 =>
        array (size=1)
          0 => (port) 33

恐怕您无法在Twig中创建这样的数组。即使将新项附加到数组中也很复杂,因为您需要为新元素创建一个数组,并将其与现有数组连接起来。示例:

{% set array = [] %}
{% for item in items %}
    {% set array = array|merge([{ title: item.title, ... }]) %}
{% endfor %}
我知道这看起来很糟糕,但所有这些不便都是故意造成的。Twig是用来创建模板的,因此用于创建或处理信息的功能受到故意的限制。其想法是应该使用PHP完成繁重的数据处理。

另一种方法:

{% set array = {
  'item-1': {
    'sub-item-1': 'my-sub-item-1',
    'sub-item-2': 'my-sub-item-2',
  },
  'item-2': {
    'sub-item-1': 'my-sub-item-1',
    'sub-item-2': 'my-sub-item-2',
  },
  'item-3': {
    'sub-item-1': 'my-sub-item-1',
    'sub-item-2': 'my-sub-item-2',
  }
}
%}

你能提供一个$units的例子吗?因为我可能会说“row”没有名为“frameNo”的键在twig中执行此操作可能会很烦人。您可以使用动态值作为键,但不确定它在嵌套结构中如何工作。我认为转换类型是应该在代码中的Transformer/Converter类中执行的逻辑,而不是在模板中执行的逻辑。您不能在twig中执行此操作,例如,您需要
merge()
。但是,虽然这是可能的,但会导致大量难看的代码(您的密钥需要临时变量…)。因此,如果您可以在php中执行此操作并将结果发送给twig,我建议您这样做。我完全理解。谢谢您。我可以使用php处理此问题,但我必须对Sonata管理包进行大量重写,以便将其添加到实体的一个显示模板中。无论如何,我将检查它。谢谢