使用 Twig 模板时,有没有办法从数组中获取平均值


Is there any way to get average values from an array when using a Twig template?

使用 Symfony2 时,有没有办法在 Twig 模板中获取值数组的平均值?我尝试了类似于以下代码的东西,但它不起作用

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

知道吗?

我认为这应该可以做到

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

假设rating.value是整数

没有内置的方法可以做到这一点。创建自己的树枝扩展可以做到这一点很简单!你需要创建一个过滤器,这在食谱中得到了很好的说明:如何编写自定义Twig扩展。

答案是正确的,但使用起来很糟糕,对吧?

很简单:

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

在现代 Twig 版本中,有一个reduce()过滤器可以稍微简化这项工作:

{% set myValues = [1, 2, 3, 4, 5] %}
{% set average = (myValues | reduce((sum, val) => sum + val, 0)) / (myValues | length) %}
{{ average }} {# 3 #}

看到这个小提琴!