2017-03-29 78 views
2

數組我有這樣的:創建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) }} 

但後來我得到一個錯誤:

Unexpected token "punctuation" of value "[" ("end of statement block" expected).

輸出應該是這樣的:

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 
+0

你能提供一個你的$單位的例子嗎?因爲我可能是「行」沒有鑰匙命名爲「frameNo」 –

+1

在樹枝做這可能會很煩人。您可以使用[attribute](http://twig.sensiolabs.org/doc/2.x/functions/attribute.html)將動態值用作關鍵字,但不確定它如何在嵌套結構中起作用。我認爲轉換類型是邏輯,應該在代碼中的Transformer/Converter類中完成,而不是在模板中完成。 – dbrumann

+0

你不能在樹枝中做到這一點,你需要例如'merge()'。但儘管這是可能的,但會導致很多醜陋的代碼(您需要臨時變量來爲您的密鑰...)。所以,如果你可以在PHP中做到這一點,並將結果發送給樹枝,我會建議。 – jeroen

回答

4

恐怕你不能像Twig那樣創建數組。即使將新項添加到數組也很複雜,因爲您需要爲新元素創建一個數組並將其與現有數組連接起來。例如:

{% set array = [] %} 
{% for item in items %} 
    {% set array = array|merge([{ title: item.title, ... }]) %} 
{% endfor %} 

我知道這看起來很糟糕,但所有這些不便都是故意完成的。 Twig旨在創建模板,因此可用於創建或處理信息的功能是有意限制的。這個想法是,大量的數據處理應該用PHP來完成。

+0

我完全理解。謝謝。我可以用PHP來處理這個,但是我必須做很多重寫Sonata Admin Bundle才能將它添加到實體的一個展示模板中。無論如何,我會檢查出來。謝謝 –