可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
How to remove duplicated items in array on Twig?
I have array value in twig such as.
{{ set array = ["testA","testB","testA","testC","testB"] }}
I want to remove duplicated items and use only testA,testB,testC
{% for name in array%}
//skip the duplicate items and use only testA,testB,testC
{% endfor %}
How can I make it ?
回答1:
Twig is a VIEW engine, and should not be used - in theory - to manipulate data. It's a (very) good practice to use (assumingly) PHP to gather data, do all necessary manipulations and then pass the right data to your view.
That said, here's how you can do it in pure Twig syntax:
{% set newArray = [] %}
{% for name in array %}
{% if name not in newArray %}
My name is {{name}}
{% set newArray = newArray|merge([name]) %}
{% endif %}
{% endfor %}
回答2:
In this case, as @Webberig said it's better to prepare your data before the rendering of the view. But when you have a more complex process and if is related to the view you can create a Twig Extension, with an extension the code would look like:
MyTwigExtension.php
for Twig versions 1.12 and greater:
/**
* {@inheritdoc}
*/
public function getFunctions()
{
return array(
new \Twig_SimpleFunction('array_unset', array($this, 'arrayUnset'))
);
}
If you are on a Twig version earlier than 1.12, use this MyTwigExtension.php
instead:
/**
* {@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;
}
Twig:
{% set query = array_unset(query, 'array_key') %}
回答3:
You can do it in one line since Twig 1.41 and 2.10:
{% set unique = array|reduce(
(unique, item) => item in unique ? unique : unique|merge([item]), []
) %}
In your example:
{% for name in array|reduce((unique, item) => item in unique ? unique : unique|merge([item]), []) %}
My name is {{name}}
{% endfor %}
回答4:
Quick Answer (TL;DR)
- A custom Twig filter
array_unique
permits removal of duplicates
- This can be directly carried over from native PHP
Detailed Answer
Context
- Twig 2.x (latest version as of Wed 2017-02-08)
- Alternate approach in comparison to other approaches specified elsewhere
Problem
- Scenario:
- DeloperSutasSugas wishes to dedupe an array
- PHP built-in array_unique function can do the job
Example01
- DeloperSutasSugas starts with a sequentially-indexed array
- transform from
BEFORE
into 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']
Solution
Custom filter
[...]
// {"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);
//;;
[...]
Output
{%- set mylist = mylist|array_unique -%}
Pitfalls
- Requires addon filter (the solution does not work with native Twig)
See also
- https://twigfiddle.com/rsl89m
回答5:
For symfony !
Service : app/config/service.yml
twig_array_unique_function:
class: AppBundle\Twig\ArrayUniqueFunction
tags:
- { name: twig.function }
Class : 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
回答6:
{% 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 %}
Modification on the accepted answer above.
I needed to remove duplicates from a set and end up with an object of just slug and title.
回答7:
The in
operator performs containment test.
It returns true if the left operand is contained in the right.
{% if name in array %}
http://twig.sensiolabs.org/doc/templates.html#containment-operator