remove twig

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 en AFTER

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



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.