remove - twig slug
Cómo eliminar elementos duplicados en la matriz en Twig (6)
¿Cómo eliminar elementos duplicados en matriz en Twig?
Tengo valor de matriz en la ramita como.
{{ set array = ["testA","testB","testA","testC","testB"] }}
Quiero eliminar los elementos duplicados y usar solo testA, testB, testC
{% for name in array%}
//skip the duplicate items and use only testA,testB,testC
{% endfor %}
¿Cómo puedo hacerlo?
Respuesta rápida (TL; DR)
- Un filtro Twig personalizado
array_unique
permite la eliminación de duplicados - Esto puede ser transferido directamente desde PHP nativo
Respuesta detallada
Contexto
- Twig 2.x (última versión a partir del miércoles 2017-02-08)
- Enfoque alternativo en comparación con otros enfoques especificados en otro lugar
Problema
- Guión:
- DeloperSutasSugas desea deshacer una matriz
- La función array_unique incorporada de PHP puede hacer el trabajo
Example01
- DeloperSutasSugas comienza con una matriz indexada secuencialmente
- transformar de
BEFORE
enAFTER
{%- 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'']
Solución
Filtro personalizado[...] // {"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); //;; [...] Salida
{%- set mylist = mylist|array_unique -%}
Escollos
- Requiere un filtro adicional (la solución no funciona con Twig nativo)
Ver también
El operador in
realiza una prueba de contención.
Devuelve true si el operando izquierdo está contenido en la derecha.
{% if name in array %}
http://twig.sensiolabs.org/doc/templates.html#containment-operator
En este caso, como @Webberig dijo que es mejor preparar sus datos antes de la visualización de la vista. Pero cuando tienes un proceso más complejo y si está relacionado con la vista, puedes crear una Extensión Twig, con una extensión, el código sería:
MyTwigExtension.php
para Twig versiones 1.12 y superiores:
/**
* {@inheritdoc}
*/
public function getFunctions()
{
return array(
new /Twig_SimpleFunction(''array_unset'', array($this, ''arrayUnset''))
);
}
Si tiene una versión Twig anterior a la 1.12, use este MyTwigExtension.php
en MyTwigExtension.php
lugar:
/**
* {@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;
}
Ramita:
{% set query = array_unset(query, ''array_key'') %}
Para Symfony!
Servicio: app / config / service.yml
twig_array_unique_function:
class: AppBundle/Twig/ArrayUniqueFunction
tags:
- { name: twig.function }
Clase: 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
Twig es un motor VIEW, y no debe utilizarse, en teoría, para manipular datos. Es una (muy) buena práctica usar (asumiendo) PHP para recopilar datos, hacer todas las manipulaciones necesarias y luego pasar los datos correctos a su vista.
Dicho esto, así es como puedes hacerlo en sintaxis Twig pura:
{% set newArray = [] %}
{% for name in array %}
{% if name not in newArray %}
My name is {{name}}
{% set newArray = newArray|merge([name]) %}
{% endif %}
{% endfor %}
{% 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 %}
Modificación en la respuesta aceptada arriba. Necesitaba eliminar duplicados de un conjunto y terminar con un objeto de solo slug y title.