在Twig模板中使用时,是否有任何方法可以从数组中获取平均值?

4

在使用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个回答

5
我觉得这应该可以解决。
{% set sumratings = 0 %}
{% for rating in article.ratings %}
  {% set sumratings = sumratings + rating.value %}
{% endfor %}
AVG: {{  sumratings / article.ratings|length }}

假设rating.value是一个整数。

没错!这就是解决方案!因此,**| length** 过滤器仅应用于表达式 a / b 的最后一个术语 (b)。太棒了,Twig 文档中没有解释这一点。非常感谢。 - JeanValjean
2
长度过滤器只是获取数组大小的一种方式。这类似于在正确位置使用PHP的count()函数。您不会写$avg = count( $sum / $values );,对吧?你应该这样写$avg = $sum / count( $values ); - Peter Bailey

4

没有内置的方法可以做到这一点。创建自己的Twig扩展来实现这个功能非常简单!您需要创建一个过滤器,这在食谱中非常好地记录下来:如何编写自定义Twig扩展


我知道!我在寻找使用内置的twig功能的可能性。 - JeanValjean

2

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

简单明了:

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

现在你可以在twig模板中这样做:
{{ somearray | arrayAverage }}
{{ somearray | arrayAverage | number_format }}

2
在现代的Twig版本中,有一个reduce()过滤器可以简化这个工作:
{% set myValues = [1, 2, 3, 4, 5] %}
{% set average = (myValues | reduce((sum, val) => sum + val, 0)) / (myValues | length) %}

{{ average }} {# 3 #}

看看this fiddle


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接