新闻详情

新闻详情

首页 / 资讯中心 / 详情

Twig 的 sort 过滤器:序列与映射排序的完整实战指南

发布时间:2026/9/26 7:30:50来源:尧图网络
Twig 的 sort 过滤器:序列与映射排序的完整实战指南
后端【免费下载链接】TwigTwig, the flexible, fast, and secure template language for PHP项目地址https://gitcode.com/gh_mirrors/tw/Twig点击查看免费下载本文围绕 Twig 模板语言PHP 模板引擎内置的sort过滤器展开讲解它如何对序列sequence与映射mapping进行排序、底层对 PHPasort/uasort的调用机制以及如何通过箭头函数 太空船操作符实现自定义排序。读完本文你将能在 Twig 模板中熟练完成基础排序、对象属性排序与映射键值保持等实战场景。一、sort过滤器是什么sort是 Twig 核心扩展CoreExtension内置的数组辅助过滤器用于对序列与映射进行排序。它定义于 src/Extension/CoreExtension.php注册时声明了needs_environment与needs_is_sandboxed两个选项说明该过滤器需要环境对象与沙箱状态作为运行时参数。最基础的用法是直接对一个数组或可迭代对象排序{% for user in users|sort %} ... {% endfor %}排序后users中的元素会按从小到大的顺序参与循环。从源码看sort的签名是public static function sort(Environment $env, bool $isSandboxed, $array, $arrow null): array其定义于 src/Extension/CoreExtension.php实现逻辑分为三步输入归一化若$array是\Traversable如\ArrayObject、生成器等先通过iterator_to_array()转为数组类型校验若转换后仍不是数组则抛出RuntimeError错误信息为The sort filter expects a sequence or a mapping, got %s.%s为实际类型执行排序有箭头函数时使用uasort()否则使用asort()最后返回排序后的数组。二、内部实现为什么是asort而不是sort原文档明确说明内部 Twig 使用 PHP 的asort函数来保持索引关联index association。这一点在源码中得到印证——无箭头函数分支调用的是asort($array)src/Extension/CoreExtension.php。asort与sort的关键区别在于sort()会重建数组索引从 0 开始重新编号而asort()会保留原始键名。因此对序列如[4, 1]排序后键仍为0, 1只是顺序变为[1, 4]对映射如[a 4, b 1]排序后键a、b依然保留仅值顺序改变可用于后续按键取值的场景。Traversable 支持由于实现中先执行iterator_to_array()任何实现Traversable接口的对象如\ArrayObject都能直接传入sort。仓库中的集成测试 tests/Fixtures/filters/sort.test 验证了这一行为{{ array1|sort|join }} {{ array2|sort|join }} {{ traversable|sort|join }}测试数据中traversable为new \ArrayObject([0 3, 1 2, 2 1])期望输出为123——证明ArrayObject被正确转换为数组并完成升序排序。三、传入箭头函数进行自定义排序仅靠asort的默认升序无法满足对象排序、倒序、多字段比较等需求因此sort接受一个可选的arrow箭头函数参数{% set fruits [ {name: Apples, quantity: 5}, {name: Oranges, quantity: 2}, {name: Grapes, quantity: 4}, ] %} {% for fruit in fruits|sort((a, b) a.quantity b.quantity)|column(name) %} {{ fruit }} {% endfor %} {# output in this order: Oranges, Grapes, Apples #}这里有几个要点箭头函数(a, b) ...接收两个元素返回负数、0 或正数分别表示a小于、等于、大于b示例中使用了**太空船操作符spaceship operator**来简化比较a.quantity b.quantity天然返回上述三种结果之一column(name)是另一个数组辅助过滤器用于从排序后的结果中提取每个元素的name字段得到[Oranges, Grapes, Apples]其用法可参考 doc/filters/column.rst。带有箭头函数的完整模板测试见 tests/Fixtures/filters/sort_with_arrow.test其中同时验证了传统三元比较与太空船操作符两种写法二者输出一致{{ fruits|sort((a, b) a.quantity b.quantity ? 0 : (a.quantity b.quantity ? 1 : -1))|column(name)|join(, ) }} {{ fruits|sort((a, b) a.quantity b.quantity)|column(name)|join(, ) }}两条模板的期望输出均为Oranges, Grapes, Apples。原理传入箭头函数后底层改用uasort($array, $arrow)src/Extension/CoreExtension.php。uasort同样保留键名且将你的比较函数作为排序回调交给 PHP 内部排序算法执行。四、沙箱模式下的约束与废弃行为由于sort注册了needs_is_sandboxed其实现会调用checkArrow()src/Extension/CoreExtension.php对箭头函数做额外校验沙箱模式下传入的必须是 PHP 原生\Closure否则抛出RuntimeErrorThe callable passed to the sort filter must be a Closure in sandbox mode.这是出于安全考虑——沙箱环境不允许执行任意可调用对象非沙箱模式自 Twig 3.15 起向sort等过滤器传入非\Closure的可调用参数会触发弃用警告deprecationTwig 4 将不再支持。因此在新代码中建议始终使用 Twig 箭头函数语法编译后即生成\Closure这是兼容当前版本与未来版本的推荐写法。五、常见错误与排查sort只接受数组或Traversable对象。若传入标量如字符串、数字或null会抛出The sort filter expects a sequence or a mapping, got string.此时应检查模板变量来源确保其是数组或实现了Traversable。若数据来自数据库查询对象ORM 集合确认其是否实现了Traversable——多数集合类满足该条件可直接排序否则需先转换为数组。六、小结sort可对序列与映射排序内部使用asort保持键名关联支持Traversable自动转数组传入箭头函数后改用uasort可配合太空船操作符实现简洁的自定义排序沙箱模式下箭头函数必须是\Closure非沙箱传非闭包自 Twig 3.15 起废弃配套的column过滤器可提取排序结果中的指定字段二者常组合使用。相关实现与测试文件核心实现见 src/Extension/CoreExtension.php过滤器注册见 src/Extension/CoreExtension.php集成测试见 tests/Fixtures/filters/sort.test 与 tests/Fixtures/filters/sort_with_arrow.test。赞分享后端【免费下载链接】TwigTwig, the flexible, fast, and secure template language for PHP项目地址https://gitcode.com/gh_mirrors/tw/Twig点击查看免费下载相关推荐Twig slice 过滤器完全指南序列、映射与字符串的切片操作Twig slice 过滤器完全指南序列、映射与字符串的切片操作 本指南围绕 Twig 内置过滤器 slice 展开完整讲解其在序列sequence、映后端Twig filter 滤镜深度解析用箭头函数过滤序列与映射Twig filter 滤镜深度解析用箭头函数过滤序列与映射 本文基于 Twig 官方文档 doc/filters/filter.rst https://li后端Twig reverse 过滤器深度解析序列、映射与字符串反转的完整用法及源码实现Twig reverse 过滤器深度解析序列、映射与字符串反转的完整用法及源码实现 本文以 Twig 官方文档 doc/filters/reverse.rst后端上一篇零代码搞定邮件智能分流Postal路由引擎3步配置主题/发件人规则下一篇无需复杂代码WebGL流体模拟中的光影魔法打造超真实流体效果创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

金融服务数字化系统实战:从账户体系到风控架构的关键设计 2026/9/26 8:17:49

金融服务数字化系统实战:从账户体系到风控架构的关键设计

第一次真正接触金融类业务,是在一个线下交易系统切到线上支付的晚上。当时我还在原来的技术团队做电商,心想这不就是交易系统多加几张表么。真正上手之后才发现,financial-services这个领域,跟普通业务系统完全不是一个量级——每…

阅读更多 →
Sunshine+Moonlight自托管串流:低延迟高画质游戏串流搭建指南 2026/9/26 8:17:42

Sunshine+Moonlight自托管串流:低延迟高画质游戏串流搭建指南

1. 为什么我最终选择了 Sunshine 加 Moonlight 这套自托管串流方案 先说结论:如果你手上有一台性能还不错的台式机或者带独显的迷你主机,又想在客厅电视、平板、轻薄本甚至手机上玩 3A 大作,Sunshine 加 Moonlight 这套组合目前是自托管串流里…

阅读更多 →
AI Agent技能体系设计:从模糊意图到可执行动作的工程实践 2026/9/26 8:17:36

AI Agent技能体系设计:从模糊意图到可执行动作的工程实践

我印象很深的一次经历:团队花了两周时间,把Agent助手从"能聊天"调到了"能干活",结果一上线就翻车——用户说"帮我把上周的销售数据整理成周报",系统愣是把"整理数据"理解成了"生成一…

阅读更多 →
Java面试八股复习:HashMap、并发与MySQL索引核心要点 2026/9/26 8:17:36

Java面试八股复习:HashMap、并发与MySQL索引核心要点

1. 内容整体设计与选题思路先解释一下“八股Day02”这个标题。现在很多技术社区和求职群里,“八股”这个词已经被重新定义了——它从早年的贬义词,变成了求职者自嘲式的统称。所谓“八股”,就是面试中最常考的、有标准答案的、背下来就能拿分…

阅读更多 →
豆包网页版批量删除历史对话:三种技术路线与实操指南 2026/9/26 8:17:29

豆包网页版批量删除历史对话:三种技术路线与实操指南

1. 为什么“批量删除历史对话”是个真需求豆包网页版用久了,侧边栏的历史对话会像滚雪球一样越积越多。我自己的账号用了不到三个月,侧边栏就攒了四百多条记录,往下翻的时候浏览器明显卡顿,找一条上周的对话得滚动半天。更麻烦的是…

阅读更多 →
VMware虚拟机磁盘空间清理与压缩全攻略:从原理到实战 2026/9/26 8:17:29

VMware虚拟机磁盘空间清理与压缩全攻略:从原理到实战

1. 虚拟机磁盘为什么会越用越大用 VMware Workstation 的人基本都会碰到同一个问题:虚拟机用着用着,宿主机上的那个文件夹就膨胀到几十个 G,明明虚拟机里删了一堆东西,宿主机上的 vmdk 文件却一点没变小。我自己的主力开发机上有三…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉