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

时间:2013-07-22 13:06:51

标签: twig

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

我在twig中有数组值,例如。

{{ set array = ["testA","testB","testA","testC","testB"]  }}

我想删除重复的项目,只使用testA,testB,testC

{% for name in array%}

 //skip the duplicate items and use only testA,testB,testC

{% endfor %}

我该怎么做?

7 个答案:

答案 0 :(得分:48)

Twig是一个VIEW引擎,理论上不应该用来操纵数据。使用(假设)PHP来收集数据,进行所有必要的操作然后将正确的数据传递给您的视图是一种(非常)良好的做法。

那就是说,你可以用纯Twig语法来实现它:

{% set newArray = [] %}

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


{% endfor %}

答案 1 :(得分:13)

在这种情况下,正如@Webberig所说,在渲染视图之前准备数据会更好。但是当你有一个更复杂的过程并且如果与视图相关时你可以创建一个Twig扩展,扩展代码看起来像:

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

/**
 * {@inheritdoc}
 */
public function getFunctions()
{
    return array(
        new \Twig_SimpleFunction('array_unset', array($this, 'arrayUnset'))
    );
}

如果您使用的是早于1.12的Twig版本,请改用此MyTwigExtension.php

/**
 * {@inheritdoc}
 */
public function getFunctions()
{
    return array(
        'array_unset' => new \Twig_Function_Method($this, 'arrayUnset')
    );
}
/**
 * Delete a key of an array
 *
 * @param array  $array Source array
 * @param string $key   The key to remove
 *
 * @return array
 */
public function arrayUnset($array, $key)
{
    unset($array[$key]);

    return $array;
}

嫩枝:

{% set query = array_unset(query, 'array_key') %}

答案 2 :(得分:1)

快速回答(TL; DR)

  • 自定义Twig过滤器array_unique允许删除重复项
  • 这可以直接从原生PHP
  • 继承

详细答案

上下文

  • Twig 2.x(截至Wed 2017-02-08的最新版本)
  • 与其他地方指定的其他方法相比的替代方法

问题

  • 方案:
  • DeloperSutasSugas希望重复数据删除
  • PHP内置的array_unique函数可以完成这项工作

Example01

  • DeloperSutasSugas以顺序索引数组开头
  • BEFORE转换为AFTER
{%- set mylist = ['alpha','alpha','bravo','charlie','alpha','alpha','delta','echo']  -%}

BEFORE: 
['alpha','alpha','bravo','charlie','alpha','alpha','delta','echo']

AFTER: 
['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);
//;;
[...]
产量
{%- set mylist = mylist|array_unique  -%}    

陷阱

  • 需要插件过滤器(该解决方案不适用于原生Twig)

另见

答案 3 :(得分:1)

对于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')];
    }
}

Thk:https://github.com/getgrav/grav/blob/develop/system/src/Grav/Common/Twig/TwigExtension.php

答案 4 :(得分:0)

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

对上面接受的答案进行修改。 我需要从一组中删除重复项,最后得到一个slug和title的对象。

答案 5 :(得分:0)

从Twig 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 %}

答案 6 :(得分:-3)

in运算符执行包含测试。

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

{% if name in array %}

http://twig.sensiolabs.org/doc/templates.html#containment-operator