如何删除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 %}
我该怎么做?
答案 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)
array_unique
允许删除重复项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 -%}
答案 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