Twig 如何删除细枝上数组中的重复项

Twig 如何删除细枝上数组中的重复项,twig,Twig,如何删除细枝上数组中的重复项 我在细枝中有数组值,例如 {{set array=[“testA”、“testB”、“testA”、“testC”、“testB”]} 我想删除重复项,只使用testA、testB、testC {%用于数组%中的名称] //跳过重复项,仅使用testA、testB、testC {%endfor%} 我该怎么做?中的操作员执行安全壳测试 如果左操作数包含在右操作数中,则返回true {% if name in array %} Twig是一个视图引擎,理论上不应

如何删除细枝上数组中的重复项

我在细枝中有数组值,例如

{{set array=[“testA”、“testB”、“testA”、“testC”、“testB”]}
我想删除重复项,只使用testA、testB、testC

{%用于数组%中的名称]
//跳过重复项,仅使用testA、testB、testC
{%endfor%}

我该怎么做?

中的
操作员执行安全壳测试

如果左操作数包含在右操作数中,则返回true

{% if name in array %}

Twig是一个视图引擎,理论上不应该用来操作数据。使用PHP收集数据,进行所有必要的操作,然后将正确的数据传递给视图,这是一个(非常)好的实践

也就是说,以下是使用纯细枝语法的方法:

{% set newArray = [] %}

{% for name in array %}
   {% if name not in newArray %}
     My name is {{name}}
   {% set newArray = newArray|merge([name]) %}
   {% endif %}


{% endfor %}

在这种情况下,正如@Webberig所说,最好在渲染视图之前准备好数据。但是当您有一个更复杂的过程,并且如果与视图相关,您可以创建一个细枝扩展,带有扩展,代码如下所示:

MyTwigExtension.php
对于Twig版本1.12及更高版本:

/**
*{@inheritardoc}
*/
公共函数getFunctions()
{
返回数组(
新建\Twig\u SimpleFunction('array\u unset',array($this,'arrayUnset'))
);
}
如果您使用的是1.12之前的Twig版本,请改用此
MyTwigExtension.php

/**
*{@inheritardoc}
*/
公共函数getFunctions()
{
返回数组(
“array\u unset”=>新的\Twig\u函数方法($this“arrayUnset”)
);
}
/**
*删除数组的键
*
*@param数组$数组源数组
*@param string$key要删除的密钥
*
*@return数组
*/
公共函数arrayUnset($array,$key)
{
未设置($array[$key]);
返回$array;
}
细枝:

{%set query=array\u unset(查询,'array\u key')%}
快速回答(TL;DR)
  • 自定义细枝过滤器
    array\u unique
    允许删除重复项
  • 这可以直接从本机PHP继承
详细答案 上下文
  • Twig 2.x(截至2017-02-08周三的最新版本)
  • 与其他地方规定的其他方法相比的替代方法
问题
  • 场景:
  • DeloperSutasSugas希望对阵列进行重复数据消除
  • PHP内置的数组_独特的函数可以完成这项工作
例01
  • DeloperSutasSugas从一个顺序索引数组开始
  • 之前
    转换为
    之后
{%-set mylist=['alpha','alpha','bravo','charlie','alpha','alpha','delta','echo']-%} 之前: ['alpha','alpha','bravo','charlie','alpha','alpha','delta','echo'] 之后: ['alpha','bravo','charlie','delta','echo'] 解决方案 自定义过滤器 [...] // {"define_filter_":"array_unique" ,"desc":"PHP array_unique function" }, $filter = new Twig_SimpleFilter('array_unique', function ( $vinp=Array() ) { $vout = ( $vinp ); $vout = array_unique( $vout ); $vout = array_values( $vout ); // PHP annoyance array reindex -- optional return $vout; }); $twig->addFilter($filter); //;; [...] [...] //{“define_filter_uu”:“array_unique”,“desc”:“PHP array_unique function”}, $filter=new Twig\u SimpleFilter('array\u unique',函数($vinp=array()){ $vout=($vinp); $vout=数组\唯一($vout); $vout=array_values($vout);//PHP烦恼数组reindex——可选 退回$vout; }); $twig->addFilter($filter); //;; [...] 输出 {%-set mylist=mylist |数组_unique-%} 陷阱
  • 需要加载项筛选器(解决方案不适用于本机细枝)
另见
    • 为symfony

      服务:app/config/Service.yml

      twig_array_unique_function:
          class: AppBundle\Twig\ArrayUniqueFunction
          tags:
              - { name: twig.function }
      
      类:src/AppBundle/Twig/ArrayUniqueFunction.php

      <?php
      
      namespace AppBundle\Twig;
      
      class ArrayUniqueFunction extends \Twig_Extension
      {
          public function getFilters()
          {
              return [new \Twig_SimpleFilter('array_unique', 'array_unique')];
          }
      
          public function getFunctions()
          {
              return [new \Twig_SimpleFunction('array_unique', 'array_unique')];
          }
      }
      
      
      对上述已接受答案的修改。
      
      我需要从集合中删除重复项,并最终得到一个只有slug和title的对象

      从细枝1.41和2.10开始,您可以在一行中完成:

      {% set unique = array|reduce(
          (unique, item) => item in unique ? unique : unique|merge([item]), []
      ) %}
      
      在您的示例中:

      {% for name in array|reduce((unique, item) => item in unique ? unique : unique|merge([item]), []) %}
           My name is {{name}}
      {% endfor %}
      

      这是怎么回答的?OP已经知道了
      操作符中的
      。。。只是不是一个完整的例子。您可以检查当前名称是否在已看到的名称数组中,如果不在,则将其添加到已看到的名称数组中;如果是这样,跳过它。经典的MVC严格性问题,什么时候数据操作不适合包含在视图中?例如,将单词改为大写是否不合适?似乎没有明确的指导规则或原则。不是我见过的。有时候很难决定你的底线在哪里。。。Twig作为一个功能极其强大的视图引擎,并不能让这个决定变得更容易。我肯定会考虑将文本更改为大写,以作为视图层的职责。或者使用CSS会更好(假设您正在生成html)
      
      {% set keeper = {} %}
      {% set throwaway = [] %}
      {% for thing in yourSet.all() %}
      
        {% if thing.id not in throwaway %}
          {% set throwaway = throwaway|merge([thing.id]) %}
          {% set keeper = keeper|merge([{ slug: thing.slug, title: thing.title}]) %}
        {% endif %}
      
      {% endfor %}
      
      {% set unique = array|reduce(
          (unique, item) => item in unique ? unique : unique|merge([item]), []
      ) %}
      
      {% for name in array|reduce((unique, item) => item in unique ? unique : unique|merge([item]), []) %}
           My name is {{name}}
      {% endfor %}