Twig 如何删除细枝上数组中的重复项
如何删除细枝上数组中的重复项 我在细枝中有数组值,例如Twig 如何删除细枝上数组中的重复项,twig,Twig,如何删除细枝上数组中的重复项 我在细枝中有数组值,例如 {{set array=[“testA”、“testB”、“testA”、“testC”、“testB”]} 我想删除重复项,只使用testA、testB、testC {%用于数组%中的名称] //跳过重复项,仅使用testA、testB、testC {%endfor%} 我该怎么做?中的操作员执行安全壳测试 如果左操作数包含在右操作数中,则返回true {% if name in array %} Twig是一个视图引擎,理论上不应
{{set array=[“testA”、“testB”、“testA”、“testC”、“testB”]}
我想删除重复项,只使用testA、testB、testC
{%用于数组%中的名称]
//跳过重复项,仅使用testA、testB、testC
{%endfor%}
我该怎么做?中的
操作员执行安全壳测试
如果左操作数包含在右操作数中,则返回true
{% if name in array %}
Twig是一个视图引擎,理论上不应该用来操作数据。使用PHP收集数据,进行所有必要的操作,然后将正确的数据传递给视图,这是一个(非常)好的实践
也就是说,以下是使用纯细枝语法的方法:
{% set newArray = [] %}
{% for name in array %}
{% if name not in newArray %}
My name is {{name}}
{% set newArray = newArray|merge([name]) %}
{% endif %}
{% endfor %}
在这种情况下,正如@Webberig所说,最好在渲染视图之前准备好数据。但是当您有一个更复杂的过程,并且如果与视图相关,您可以创建一个细枝扩展,带有扩展,代码如下所示:
MyTwigExtension.php
对于Twig版本1.12及更高版本:
/**
*{@inheritardoc}
*/
公共函数getFunctions()
{
返回数组(
新建\Twig\u SimpleFunction('array\u unset',array($this,'arrayUnset'))
);
}
如果您使用的是1.12之前的Twig版本,请改用此MyTwigExtension.php
:
/**
*{@inheritardoc}
*/
公共函数getFunctions()
{
返回数组(
“array\u unset”=>新的\Twig\u函数方法($this“arrayUnset”)
);
}
/**
*删除数组的键
*
*@param数组$数组源数组
*@param string$key要删除的密钥
*
*@return数组
*/
公共函数arrayUnset($array,$key)
{
未设置($array[$key]);
返回$array;
}
细枝:
{%set query=array\u unset(查询,'array\u key')%}
快速回答(TL;DR)
- 自定义细枝过滤器
array\u unique
允许删除重复项
- 这可以直接从本机PHP继承
详细答案
上下文
- Twig 2.x(截至2017-02-08周三的最新版本)
- 与其他地方规定的其他方法相比的替代方法
问题
- 场景:
- DeloperSutasSugas希望对阵列进行重复数据消除
- PHP内置的数组_独特的函数可以完成这项工作
例01
- DeloperSutasSugas从一个顺序索引数组开始
- 从
之前
转换为之后
{%-set mylist=['alpha','alpha','bravo','charlie','alpha','alpha','delta','echo']-%}
之前:
['alpha','alpha','bravo','charlie','alpha','alpha','delta','echo']
之后:
['alpha','bravo','charlie','delta','echo']
解决方案
自定义过滤器
[...]
// {"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);
//;;
[...]
[...]
//{“define_filter_uu”:“array_unique”,“desc”:“PHP array_unique function”},
$filter=new Twig\u SimpleFilter('array\u unique',函数($vinp=array()){
$vout=($vinp);
$vout=数组\唯一($vout);
$vout=array_values($vout);//PHP烦恼数组reindex——可选
退回$vout;
});
$twig->addFilter($filter);
//;;
[...]
输出
{%-set mylist=mylist |数组_unique-%}
陷阱
- 需要加载项筛选器(解决方案不适用于本机细枝)
另见
为symfony
服务:app/config/Service.yml
twig_array_unique_function:
class: AppBundle\Twig\ArrayUniqueFunction
tags:
- { name: twig.function }
类: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')];
}
}
对上述已接受答案的修改。
我需要从集合中删除重复项,并最终得到一个只有slug和title的对象 从细枝1.41和2.10开始,您可以在一行中完成:
{% set unique = array|reduce(
(unique, item) => item in unique ? unique : unique|merge([item]), []
) %}
在您的示例中:
{% for name in array|reduce((unique, item) => item in unique ? unique : unique|merge([item]), []) %}
My name is {{name}}
{% endfor %}
这是怎么回答的?OP已经知道了
操作符中的。。。只是不是一个完整的例子。您可以检查当前名称是否在已看到的名称数组中,如果不在,则将其添加到已看到的名称数组中;如果是这样,跳过它。经典的MVC严格性问题,什么时候数据操作不适合包含在视图中?例如,将单词改为大写是否不合适?似乎没有明确的指导规则或原则。不是我见过的。有时候很难决定你的底线在哪里。。。Twig作为一个功能极其强大的视图引擎,并不能让这个决定变得更容易。我肯定会考虑将文本更改为大写,以作为视图层的职责。或者使用CSS会更好(假设您正在生成html)
{% 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 %}
{% set unique = array|reduce(
(unique, item) => item in unique ? unique : unique|merge([item]), []
) %}
{% for name in array|reduce((unique, item) => item in unique ? unique : unique|merge([item]), []) %}
My name is {{name}}
{% endfor %}