2012-05-15 1 views
2

Есть ли способ получить среднее значение массива значений только внутри шаблона Twig при использовании Symfony2? я пытался что-то вроде следующего кода, но он не работаетЕсть ли способ получить средние значения из массива при использовании шаблона Twig?

{% set sumratings = 0 %} 
{% set count = 0 %} 
{% for rating in article.ratings %} 
    {% set sumratings = sumratings + rating.value %} 
{% endfor %} 
AVG: {{ sumratings/article.ratings.count }} 

Любая идея?

ответ

4

Я думаю, что это нужно сделать, это

{% set sumratings = 0 %} 
{% for rating in article.ratings %} 
    {% set sumratings = sumratings + rating.value %} 
{% endfor %} 
AVG: {{ sumratings/article.ratings|length }} 

Предполагая, что rating.value представляет собой целое

+0

Правый человек! Это решение! Итак, ** | длина ** фильтр применяется только к последнему члену (** b **) выражения ** a/b **. Фантастично, это не объясняется в документах Twig. Большое спасибо. – JeanValjean

+2

Фильтр длины - это всего лишь способ получить размер массива. Это аналогично использованию PHP count() в нужном месте. Вы бы не делали '$ avg = count ($ sum/$ values);' right? Вы бы сделали это '$ avg = $ sum/count ($ values);' –

4

Там нет встроенного способа сделать это. Создание собственного расширения ветки, которое может сделать это просто! Вам нужно создать фильтр, который очень хорош в поваренной книге: How to write a custom Twig Extension.

+0

Я это знаю! Я смотрел на возможность использовать такую ​​встроенную функцию твига. – JeanValjean

1

Ответ правильный, но ужасный в использовании, не так ли?

Это просто:

function arrayAverage($array) 
    { 
     if (!is_array($array)) return false; 
     if (!count($array)) return 0; 
     $avg=0; 
     foreach ($array as $num) $avg+=$num; 
     $avg/=count($array); 
     return $avg; 
    } 


$twig->addFilter('arrayAverage', new Twig_Filter_Function('arrayAverage')); 

Теперь вы можете просто сделать, как это в ваших шаблонах прута:

{{ somearray | arrayAverage }} 
{{ somearray | arrayAverage | number_format }}