Я прочитал в документации Twig, что можно перебирать ассоциативный массив следующим образом:
{% for key, value in array %} {{key}} {{value}} {% endfor %}
Мне было интересно, возможно ли это для объектов типа stdClass. Я пробовал, и он не работает.
РЕДАКТИРОВАТЬ:
Я бы ожидал, что Twig будет перебирать значения свойств объекта, используя имена свойств в качестве ключей. Вместо этого блок команд, содержащийся в цикле for, вообще не выполняется.
Вы можете сначала передать объект в массив. Вы можете создать собственный фильтр, отбрасывающий ваш объект в массив. Подробнее о фильтрах можно найти здесь: http://twig.sensiolabs.org/doc/advanced.html#filters
Тогда это может выглядеть так:
{% for key, value in my_object|cast_to_array %}
После загрузки TWIG добавьте этот фильтр:
$twig->addFilter( new Twig_SimpleFilter('cast_to_array', function ($stdClassObject) { $response = array(); foreach ($stdClassObject as $key => $value) { $response[] = array($key, $value); } return $response; }));
Это называется cast_to_array после предложения Тадека . 🙂 Я уверен, что это не работает для какого-либо объекта stdClass , но он наверняка решил мою проблему с печатью ассоциативных массивов PHP 🙂 Используйте его следующим образом:
{% for key, value in my_object|cast_to_array %} <td>{{ value.1 }}</td> {% endfor %}
Поскольку я часто попадал на эту страницу SO, я думаю, что уместно показать, где я использую Twig для итерации над свойствами объекта , поэтому это полезно для других людей с одинаковой проблемой: я пытался распечатать таблицу из .json source, но PHP json_decode преобразует любой «ключ»: «значение» в ассоциативный массив PHP, который по умолчанию не печатает Twig. Таким образом, этот фильтр разрезает и доставляет обычный массив, который будет использоваться Twig.
{ "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" }] } } }
<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>
Чтобы ответить Тадеку, вот как это сделать:
Если вы еще не создали или не установили расширение 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')), ); }
2) добавьте в свой AppBundle / Twig / AppExtension.php
public function objectFilter($stdClassObject) { // Just typecast it to an array $response = (array)$stdClassObject; return $response; }
3) В вашей строке example.html.twig через ветку и фильтр.
{% for key, value in row|cast_to_array %} <td id="col" class="hidden-xs">{{ value }}</td> {% endfor %}
Совершено, надеюсь, это поможет. От указателя Тадека.
В случае, если это помогает кому-то другому. Вы можете иметь Twig итерацию свойств вашего объекта при условии реализации интерфейса Iterator PHP.
В моем случае у меня есть общий объект, который использует магические методы __get (), __set (), __isset () и __unset () при сохранении пар парам значений в частном массиве. Это отлично работает в Twig, пока вы не захотите перебирать объект, используя что-то вроде этого
<ul> {% for prop, value in object %} <li>{{prop|replace({'_': ' '})|title}}</li> {% endfor %} </ul>
Чтобы он работал, мне пришлось реализовать интерфейс Iterator. Тогда приведенный выше код работал отлично.
Теперь из-за волшебства __get () имена свойств не чувствительны к регистру, поэтому каждая из них также работает.
<ul> {% for object in arrayOfObjects %} <li>{{ object.property }}</li> <li>{{ object.Property }}</li> <li>{{ object.PROPERTY }}</li> {% endfor %} </ul>
Я знаю, что это старый, но не
$assoc_array = json_decode(json_encode($stdClassObject), TRUE);
работать так же хорошо?