Twig迭代对象属性

Bog*_*dan 23 php twig

我在Twig文档中读到可以通过以下方式迭代关联数组:

{% for key, value in array %}  
 {{key}}  
 {{value}}  
{% endfor %}  
Run Code Online (Sandbox Code Playgroud)

我想知道这是否也适用于stdClass类型的对象.

我希望Twig以属性名称作为键来迭代对象的属性值.相反,for循环中包含的指令块根本不执行.

Tad*_*eck 22

您可以先将对象强制转换为数组.您可以构建自己的过滤器,将对象转换为数组.有关过滤器的更多信息,请访问:http://twig.sensiolabs.org/doc/advanced.html#filters

它可能看起来像那样:

{% for key, value in my_object|cast_to_array %}
Run Code Online (Sandbox Code Playgroud)


rob*_*.cr 8

加载TWIG后,添加此过滤器:

$twig->addFilter( new Twig_SimpleFilter('cast_to_array', function ($stdClassObject) {
    $response = array();
    foreach ($stdClassObject as $key => $value) {
        $response[] = array($key, $value);
    }
    return $response;
}));
Run Code Online (Sandbox Code Playgroud)

它的命名cast_to_arrayTadeck的建议.:)我确定它不适用于任何类型的stdClass对象,但它确实解决了我打印PHP 关联数组的问题 :)使用如下:

{% for key, value in my_object|cast_to_array %}
    <td>{{ value.1 }}</td>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

番外篇

由于我进入了这个SO页面很多,我认为显示我在哪里使用Twig 迭代对象属性是相关的,所以它对其他有相同问题的人有用:我试图从.json打印一个表但是,PHP的json_decode将任何"key":"value"转换为PHP关联数组,Twig默认不打印.因此,这个过滤器可以切割并提供一个由Twig使用的常规数组.

source.json

{
    "user": {
        "family": {
            "table": [{
                "First_Name": "John",
                "Last_Name": "Foo",
                "Age": 25,
                "Role": "Brother"
            }, {
                "First_Name": "Mary",
                "Last_Name": "Bar",
                "Age": 14,
                "Role": "Sister"
            }, {
                "First_Name": "Joe",
                "Last_Name": "Baz",
                "Age": 33,
                "Role": "Uncle"
            }]
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

枝条

<table>
  <thead>
    <tr> {# get table headers from the table row #}
      {% for row in user.family.table.0|cast_to_array %}
        <th>{{ row.0 | replace({'_': ' '}) }}</th>
      {% endfor %}
    </tr>
  </thead>
  <tbody>
    {% for row in user.family.table %}
      <tr>
      {% for key, value in row|cast_to_array %}
        <td>{{ value.1 }}</td>
      {% endfor %}
      </tr>
    {% endfor %}
  </tbody>
</table>
Run Code Online (Sandbox Code Playgroud)

  • 对象可以像数组一样迭代,Twig应该提供功能,而不是将其带走并强制进行不必要的数据按摩. (3认同)

小智 8

我知道这很旧,但是,不会

$assoc_array = json_decode(json_encode($stdClassObject), TRUE);
Run Code Online (Sandbox Code Playgroud)

工作也一样吗?

  • 请仅回答您理解的问题。这是 PHP 代码。问题是关于 Twig 代码。 (2认同)

Dun*_*ung 6

在这里完成Tadeck的答案是:

如果您还没有创建或设置Twig扩展(过滤器),则需要先按照此说明进行操作http://symfony.com/doc/2.7/cookbook/templating/twig_extension.html

1)添加到你的AppBundle/Twig/AppExtension.php('cast_to_array')

public function getFilters()
{
    return array(
        new \Twig_SimpleFilter('md2html', array($this, 'markdownToHtml'), array('is_safe' => array('html'))),
        new \Twig_SimpleFilter('price', array($this, 'priceFilter')),
        new \Twig_SimpleFilter('cast_to_array', array($this, 'objectFilter')),
    );
}
Run Code Online (Sandbox Code Playgroud)

2)添加到AppBundle/Twig/AppExtension.php

public function objectFilter($stdClassObject) {
    // Just typecast it to an array
    $response = (array)$stdClassObject;

    return $response;
}
Run Code Online (Sandbox Code Playgroud)

3)在你的example.html.twig循环中使用twig和过滤器.

{% for key, value in row|cast_to_array %}
       <td id="col" class="hidden-xs">{{ value }}</td>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

完成,我希望它有所帮助.来自塔德克的指针.


小智 5

万一这对其他人有帮助。如果您实现了 PHP 的 Iterator 接口,您就可以让 Twig 迭代对象的属性。

就我而言,我有一个通用对象,它使用魔术方法 __get()、__set()、__isset() 和 __unset(),同时将键值对存储在私有数组中。这在 Twig 中工作得很好,直到你想使用这样的东西迭代对象

<ul>
{% for prop, value in object %}
    <li>{{prop|replace({'_': ' '})|title}}</li>
{% endfor %}
</ul>
Run Code Online (Sandbox Code Playgroud)

为了使其工作,我必须实现 Iterator 接口。然后上面的代码就完美运行了。

现在,由于 __get() 的神奇作用,属性名称也不区分大小写,因此这些属性也都可以工作。

<ul>
{% for object in arrayOfObjects %}
    <li>{{ object.property }}</li>
    <li>{{ object.Property }}</li>
    <li>{{ object.PROPERTY }}</li>
{% endfor %}
</ul>
Run Code Online (Sandbox Code Playgroud)