Прокрутка по свойствам объекта

Я прочитал в документации 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.

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" }] } } } 

прут

 <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); 

работать так же хорошо?