wake-up-neo.com

So entfernen Sie doppelte Elemente im Array von Twig

Wie entferne ich doppelte Elemente im Array von Twig?

Ich habe einen Array-Wert im Zweig wie.

{{ set array = ["testA","testB","testA","testC","testB"]  }}

Ich möchte duplizierte Elemente entfernen und nur testA, testB, testC verwenden

{% for name in array%}

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

{% endfor %}

Wie kann ich es schaffen?

22
whitebear

Twig ist eine VIEW-Engine und sollte theoretisch nicht zur Manipulation von Daten verwendet werden. Es ist eine (sehr) bewährte Methode, (vermutlich) PHP zu verwenden, um Daten zu sammeln, alle erforderlichen Manipulationen vorzunehmen und dann die richtigen Daten an Ihre Ansicht weiterzuleiten.

Das heißt, wie Sie es in reiner Twig-Syntax tun können:

{% set newArray = [] %}

{% for name in array %}
   {% if name not in newArray %}
     My name is {{name}}
   {% set newArray = newArray|merge([name]) %}
   {% endif %}


{% endfor %}
48
Webberig

In diesem Fall, wie @Webberig sagte, ist es besser, Ihre Daten vor dem Rendern der Ansicht aufzubereiten. Wenn Sie einen komplexeren Prozess haben und sich auf die Ansicht beziehen, können Sie eine Twig-Erweiterung erstellen. Mit einer Erweiterung würde der Code folgendermaßen aussehen:

MyTwigExtension.php für Twig-Versionen 1.12 und höher:

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

Wenn Sie eine ältere Version als 1.12 haben, verwenden Sie stattdessen diesen 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;
}

Zweig:

{% set query = array_unset(query, 'array_key') %}
13
COil

Schnelle Antwort (TL; DR)

  • Ein benutzerdefinierter Twig-Filter array_unique ermöglicht das Entfernen von Duplikaten
  • Dies kann direkt von nativem PHP übernommen werden

Ausführliche Antwort

Kontext

  • Zweig 2.x (letzte Version am Mi 08.02.2017)
  • Alternativer Ansatz im Vergleich zu anderen an anderer Stelle angegebenen Ansätzen

Problem

  • Szenario:
  • DeloperSutasSugas möchte ein Array deduplizieren
  • Die integrierte Array_unique-Funktion von PHP kann diese Aufgabe erledigen

Beispiel01

  • DeloperSutasSugas beginnt mit einem sequenziell indizierten Array
  • umwandlung von BEFORE in AFTER 
 {% - set mylist = ['alpha', 'alpha', 'bravo', 'charlie', 'alpha', 'alpha', 'delta', 'echo'] -%} 

BEFORE: 
 ['Alpha', 'alpha', 'bravo', 'charlie', 'alpha', 'alpha', 'delta', 'echo'] 

 NACH: 
 ['alpha', 'bravo', 'charlie', 'delta', 'echo'] 

Lösung

 [...] 
 // {"define_filter _": "array_unique", "desc": "PHP array_unique-Funktion"}, 
 $ filter = neuer Twig_SimpleFilter ('array_unique', Funktion ($ vinp = Array ()) {
 $ Vout = ($ vinp); 
 $ Vout = array_unique ($ vout); 
 $ Vout = array_values ​​($ vout); // PHP Störfeld reindex - optional 
 return $ vout; 
}); 
 $ twig-> addFilter ($ filter); 
 // ;; 
 [...] 
 {% - set mylist = mylist | array_unique -%} 

Fallstricke

  • Benötigt einen Addon-Filter (die Lösung funktioniert nicht mit nativem Twig)

Siehe auch

1
dreftymac

Für symfony!

Dienst: app/config/service.yml

twig_array_unique_function:
    class: AppBundle\Twig\ArrayUniqueFunction
    tags:
        - { name: twig.function }

Klasse: 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

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

Änderung der akzeptierten Antwort oben . Ich musste Duplikate aus einem Set entfernen und am Ende ein Objekt mit nur Slug und Titel erhalten. 

0
Jeremy A

Du kannst es in einer Zeile machen seit Twig 1.41 und 2.10:

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

In deinem Beispiel:

{% for name in array|reduce((unique, item) => item in unique ? unique : unique|merge([item]), []) %}
     My name is {{name}}
{% endfor %}
0
Nove