Comment supprimer les éléments en double dans un tableau sur Twig?
J'ai la valeur de tableau dans la brindille telle que.
{{ set array = ["testA","testB","testA","testC","testB"] }}
Je souhaite supprimer les éléments en double et n'utiliser que testA, testB, testC
{% for name in array%}
//skip the duplicate items and use only testA,testB,testC
{% endfor %}
Comment puis-je le faire?
Twig est un moteur VIEW et ne devrait pas être utilisé - en théorie - pour manipuler des données. C'est une (très) bonne pratique d'utiliser (en principe) PHP pour collecter des données, effectuer toutes les manipulations nécessaires, puis transmettre les bonnes données à votre vue.
Cela dit, voici comment vous pouvez le faire en syntaxe pure Twig:
{% set newArray = [] %}
{% for name in array %}
{% if name not in newArray %}
My name is {{name}}
{% set newArray = newArray|merge([name]) %}
{% endif %}
{% endfor %}
Dans ce cas, comme @Webberig l'a dit, il est préférable de préparer vos données avant le rendu de la vue. Mais lorsque vous avez un processus plus complexe et que, s'il est lié à la vue, vous pouvez créer une extension Twig, avec une extension, le code ressemblerait à ceci:
MyTwigExtension.php
pour les versions 1.12 et supérieures de Twig:
/**
* {@inheritdoc}
*/
public function getFunctions()
{
return array(
new \Twig_SimpleFunction('array_unset', array($this, 'arrayUnset'))
);
}
Si vous utilisez une version de Twig antérieure à 1.12, utilisez plutôt ce 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;
}
Brindille:
{% set query = array_unset(query, 'array_key') %}
array_unique
permet de supprimer les doublons.BEFORE
en AFTER
{% - set mylist = ['alpha', 'alpha', 'bravo', 'charlie', 'alpha', 'alpha', 'delta', 'echo'] -%} .____ .AVANT: ['Alpha', 'alpha', 'bravo', 'charlie', 'alpha', 'alpha', 'delta', 'echo'] .______. APRES: ['alpha', 'bravo', 'charlie', 'delta', 'écho']
[...] .__ // // "define_filter _": "array_unique", "desc": "PHP array_unique function"}, $ filter = new Twig_SimpleFilter ('array_unique', fonction ($ vinp = Array ()) { $ Vout = ($ vinp); $ Vout = array_unique ($ vout); $ Vout = array_values ($ vout); // PHP tableau de désagrément reindex - optionnel return $ vout; }); $ twig-> addFilter ($ filter); // ;; [...]
{% - set mylist = mylist | array_unique -%}
Pour symfony!
Service: app/config/service.yml
twig_array_unique_function:
class: AppBundle\Twig\ArrayUniqueFunction
tags:
- { name: twig.function }
Classe: 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')];
}
}
Merci: https://github.com/getgrav/grav/blob/develop/system/src/Grav/Common/Twig/TwigExtension.php
{% 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 de la réponse acceptée ci-dessus… .. Il me fallait supprimer les doublons d'un ensemble et me retrouver avec un objet de type slug et title.