如何在Twig模板中对数组先按lname再按name排序?
当然可以直接在Twig模板里搞定这个排序需求!
完全不需要在传入模板前提前排序或者创建自定义扩展,Twig本身就支持通过sort过滤器结合自定义比较逻辑来实现多字段排序。
推荐实现(Twig 2.12+ 版本)
从Twig 2.12开始支持箭头函数,写法简洁直观:
{% set temp = [ {"name": 'Tom', 'lname': 'Marko'}, {"name": 'Nick', 'lname': 'Montana'}, {"name": 'Tina', 'lname': 'Marko'}, {"name": 'Mike', 'lname': 'Miles'} ] %} {% set sortedTemp = temp|sort((a, b) => a.lname <=> b.lname ?: a.name <=> b.name ) %}
逻辑说明
<=>是Twig的太空船运算符,用来比较两个值:返回-1(前者更小)、0(两者相等)、1(前者更大)- 先比较
lname字段,如果两个元素的姓氏相同(返回0),则通过?:运算符继续比较name字段,完美实现「先按姓氏排序,姓氏相同再按名字排序」的需求。
旧版本Twig(低于2.12)兼容写法
如果你的Twig版本不支持箭头函数,用匿名函数也能实现:
{% set sortedTemp = temp|sort(function(a, b) { if (a.lname != b.lname) { return a.lname < b.lname ? -1 : 1; } return a.name < b.name ? -1 : 1; }) %}
最终效果
两种写法得到的sortedTemp都会和你预期的结果完全一致:
[ {"name": 'Tina', 'lname': 'Marko'}, {"name": 'Tom', 'lname': 'Marko'}, {"name": 'Mike', 'lname': 'Miles'}, {"name": 'Nick', 'lname': 'Montana'} ]
内容的提问来源于stack exchange,提问作者user11005120
相关产品推荐
相关产品推荐

