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?
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 %}
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') %}
array_unique
ermöglicht das Entfernen von DuplikatenBEFORE
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']
[...] // {"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 -%}
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
{% 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.
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 %}