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

whi*_*ear 23 twig

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

我在树枝上有数组值,比如.

{{ set array = ["testA","testB","testA","testC","testB"]  }}
Run Code Online (Sandbox Code Playgroud)

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

{% for name in array%}

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

{% endfor %}
Run Code Online (Sandbox Code Playgroud)

我该怎么做?

Web*_*rig 49

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 %}
Run Code Online (Sandbox Code Playgroud)

  • 有时很难决定在哪里划定界线……Twig作为一个功能强大的视图引擎并不能使这一决定变得容易。我一定会考虑将文本更改为大写是视图层的职责。或者使用CSS甚至更好(假设您正在生成html) (2认同)

COi*_*Oil 15

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

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

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

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

/**
 * {@inheritdoc}
 */
public function getFunctions()
{
    return array(
        'array_unset' => new \Twig_Function_Method($this, 'arrayUnset')
    );
}
Run Code Online (Sandbox Code Playgroud)
/**
 * 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;
}
Run Code Online (Sandbox Code Playgroud)

枝条:

{% set query = array_unset(query, 'array_key') %}
Run Code Online (Sandbox Code Playgroud)


Nov*_*ove 8

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

{% set unique = array|reduce(
    (unique, item) => item in unique ? unique : unique|merge([item]), []
) %}
Run Code Online (Sandbox Code Playgroud)

在你的例子中:

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