web-dev-qa-db-fra.com

Comment supprimer les éléments en double dans un tableau sur Twig

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?

22
whitebear

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 %}
48
Webberig

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') %}
13
COil

Réponse rapide (TL; DR)

  • Un filtre Twig personnalisé array_unique permet de supprimer les doublons.
  • Cela peut être directement reporté de PHP natif

Réponse détaillée

Le contexte

  • Twig 2.x (dernière version en date du mer. 2017-02-08)
  • Approche alternative par rapport aux autres approches spécifiées ailleurs

Problème

  • Scénario:
  • DeloperSutasSugas souhaite dédupliquer un tableau
  • La fonction array_unique intégrée de PHP peut faire le travail

Exemple01

  • DeloperSutasSugas commence par un tableau indexé séquentiellement
  • transformer de 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'] 

Solution

 [...] .__ // // "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 -%} 

Les pièges

  • Nécessite un filtre d'addon (la solution ne fonctionne pas avec Twig natif)

Voir également

1
dreftymac

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

1
K0rell
{% 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. 

0
Jeremy A