新闻详情

新闻详情

首页 / 资讯中心 / 详情

Twig `mapping` 测试:判断 PHP 关联数组与对象的模板写法指南

发布时间:2026/11/12 18:13:33来源:尧图网络
Twig `mapping` 测试:判断 PHP 关联数组与对象的模板写法指南
后端【免费下载链接】TwigTwig, the flexible, fast, and secure template language for PHP项目地址https://gitcode.com/gh_mirrors/tw/Twig点击查看免费下载导读本文基于 Twig 模板引擎官方文档中关于mapping测试的说明doc/tests/mapping.rst深入讲解如何在 Twig 模板中判断一个变量是否为映射mapping并结合仓库源码中的核心实现CoreExtension.php与测试用例tests/Fixtures/tests/mapping.test进行底层原理剖析。读完本文你将掌握mapping测试的语法、与sequence/iterable测试的边界差异以及它在for循环等常见场景中的实战用法。什么是mapping测试Twig 提供了丰富的测试test运算符用于在模板中对变量进行类型与结构判断。其中mapping测试用于检查一个变量是否为映射mapping。在 Twig 语境下序列sequence键为连续整数0、1、2……的数组即 PHP 中的列表list映射mapping键为字符串或非连续整数的数组即 PHP 中的关联数组以及任意对象object。mapping测试在模板中的语法为variable is mapping返回布尔值可直接用于{% if %}、{% set %}、三元表达式等场景。基本语法与官方示例mapping测试的官方文档doc/tests/mapping.rst给出了如下示例{% set users {alice: Alice Dupond, bob: Bob Smith} %} {# evaluates to true if the users variable is a mapping #} {% if users is mapping %} {% for key, user in users %} {{ key }}: {{ user }}; {% endfor %} {% endif %}这段代码演示了两个要点用花括号字面量定义映射{alice: Alice Dupond, bob: Bob Smith}创建了一个以字符串为键、字符串为值的映射。键名alice、bob是名称name形式Twig 会将其等价为字符串字面量alice、bob用is mapping判断后安全遍历只有当users确实是映射时才进入循环配合{% for key, user in users %}可以同时取出键与值输出alice: Alice Dupond; bob: Bob Smith;。映射字面量的写法细节从源码 LiteralExpressionParser.php 可以看出Twig 解析映射字面量时支持四种键的写法数字{1: one}字符串{a: x}名称等价于字符串{alice: x}括号包裹的任意表达式{(1 2): x}。另外{a}是{a: a}的简写即键与值引用同名变量映射支持尾随逗号还支持...展开运算符例如{firstName: Ryan, ...morePersonalDetails}见 spread_mapping_operator.test。解析错误时如键未加引号且不是合法名称/数字/括号表达式会抛出语法错误提示。底层实现testMapping到底判断了什么mapping测试在核心扩展中注册见 CoreExtension.phpnew TwigTest(mapping, [self::class, testMapping], [always_allowed_in_sandbox true]),其实现为src/Extension/CoreExtension.php#L1503-L1524public static function testMapping($value): bool { if ($value instanceof \ArrayObject) { $value $value-getArrayCopy(); } if ($value instanceof \Traversable) { $value iterator_to_array($value); } return (\is_array($value) !array_is_list($value)) || \is_object($value); }逐行解读其判定逻辑ArrayObject归一化如果值是\ArrayObject先转为普通数组再判断保证该类型的容器与原生数组行为一致可遍历对象归一化如果值是\Traversable如\ArrayIterator、生成器等用iterator_to_array()转为数组最终判定条件是数组且不是列表!array_is_list($value)——即关联数组判定为映射或者是对象——任意 PHP 对象都判定为映射。需要注意array_is_list()是 PHP 8.1 的函数判定数组的键是否为从 0 开始的连续整数。因此[foo, bar]是序列而非映射而[foo bar]、[1 a, 3 b]键不连续都被判定为映射。与sequence测试的对比mapping与同族的sequence测试恰好互补sequence.rst、CoreExtension.php#L1490-L1501变量is mappingis sequence[a, b]列表falsetrue[foo bar]关联数组truefalse[1 a, 3 b]键不连续truefalsenew \stdClass()truefalsehello字符串falsefalse而iterable测试iterable.rst则更宽泛只要变量是数组或可遍历对象即为true无论其是序列还是映射。边界行为空数组与各种 PHP 类型仓库自带的集成测试 tests/Fixtures/tests/mapping.test 覆盖了完整边界情况{{ empty is mapping ? ok : ko }} {{ sequence is mapping ? ok : ko }} {{ empty_array_obj is mapping ? ok : ko }} {{ sequence_array_obj is mapping ? ok : ko }} {{ mapping_array_obj is mapping ? ok : ko }} {{ obj is mapping ? ok : ko }} {{ mapping is mapping ? ok : ko }} {{ string is mapping ? ok : ko }}测试数据与期望输出如下变量PHP 值is mapping结果[]空数组kofalse空数组是空列表[foo, bar, baz]列表konew \ArrayObject()空konew \ArrayObject([foo, bar])列表型konew \ArrayObject([foo bar])关联型oknew \stdClass()ok[foo bar, bar foo]关联数组oktest字符串ko从中可以总结出几条实用结论空数组[]不是映射它被当作空序列判断空容器时应配合empty测试使用ArrayObject的表现取决于其内部内容关联内容为映射列表内容为序列任何非Traversable的对象都是映射如stdClass、实体对象等字符串、数字、布尔值等标量都不是映射。实战场景在模板中安全地遍历映射mapping测试最常见的价值在于让模板对不同数据结构给出不同的渲染策略避免在非映射值上盲目调用键值遍历。典型写法{% if user is mapping %} {# 关联数组 / 对象按 键 值 遍历 #} {% for key, value in user %} dt{{ key }}/dt dd{{ value }}/dd {% endfor %} {% else %} {# 标量或其他类型直接输出 #} p{{ user }}/p {% endif %}结合{% set %}与字面量可以构造可配置的模板逻辑{% set defaults {theme: light, locale: en} %} {% set settings settings is defined and settings is mapping ? defaults|merge(settings) : defaults %} {% for key, value in settings %} {{ key }} {{ value }} {% endfor %}此外由于mapping测试被标记为always_allowed_in_sandboxCoreExtension.php#L327在 Twig 沙箱sandbox模式下也可无条件使用不受安全策略白名单限制适合在渲染不可信模板的场景如render_sandboxed中做防御性判断。小结mapping测试的语法为variable is mapping用于判断变量是否为关联数组或对象判定逻辑定义在 src/Extension/CoreExtension.php#L1503-L1524ArrayObject/Traversable先归一化再以array_is_list()区分关联与列表对象恒为映射边界行为经 tests/Fixtures/tests/mapping.test 充分验证空数组、列表、字符串均非映射关联数组、关联型ArrayObject、stdClass均为映射与sequence测试互补、比iterable测试更精确是处理键值数据、实现差异化渲染的可靠工具。赞分享后端【免费下载链接】TwigTwig, the flexible, fast, and secure template language for PHP项目地址https://gitcode.com/gh_mirrors/tw/Twig点击查看免费下载相关推荐Hugo 模板函数 reflect.IsSite 详解判断值是否为 Site 对象Hugo 模板函数 reflect.IsSite 详解判断值是否为 Site 对象 导读 reflect.IsSite 是 Hugo 在 v0.154.0 中开发工具前端CLIHugo 页面方法 Eq判断两个 Page 对象是否相等的方法与模板实践Hugo 页面方法 Eq判断两个 Page 对象是否相等的方法与模板实践 导读 Page.Eq 是 Hugo 模板系统中用于判断两个 Page 对象是否指向开发工具前端CLIRawTherapee工作流程优化从导入到导出的高效照片处理方案RawTherapee工作流程优化从导入到导出的高效照片处理方案 RawTherapee是一款功能强大的跨平台原始照片处理程序能够帮助摄影爱好者和专业人士实桌面应用图形学上一篇Skill Seekers实战教程10步创建React、Godot、Django等流行框架技能下一篇EnvFile开源项目使用教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

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

较早相关资讯

最新相关资讯

【外设】之大彩串口显示屏 2026/11/13 0:43:49

【外设】之大彩串口显示屏

大彩串口屏初步使用 1 .官网下载 STM32 屏幕 GUI 设计资料 http://www.gz-dc.com/category/typeid/4112 找到 STM32 Keil 工程,移植相关代码因项目而异进行移植,由于项目简单,本人只对用到的指令接口进行修改。 比如:注意事项&…

阅读更多 →
无法下载Windows系统iso文件 2026/11/12 23:59:09

无法下载Windows系统iso文件

当我遇到这个问题的时候,我打开了一个网站: 登录 然后我打算下载的时候: 突然那个官方的连接就可以下载了:

阅读更多 →
【清华代码熊】DeepSeek V4.1 Flash 后训练详解 2026/11/12 9:50:02

【清华代码熊】DeepSeek V4.1 Flash 后训练详解

📌 上期解析了 DeepSeek V4.1 Flash 模型架构改进,本期解析 DeepSeek V4.1 Flash 预训练/后训练技术: 🌟 预训练:45T 文本 多模态混合语料、直接训练 sparse attention(取消 DeepSeek V4 的 dense 冷启动&…

阅读更多 →
Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ... 2026/11/12 9:25:38

Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ...

文章主要内容和创新点 主要内容 本文聚焦于多模态大语言模型(MLLM)强化学习(RL)训练中的效率问题,提出了一个名为Shuffle-R1的框架。研究发现,当前RL训练存在两个关键缺陷: 优势值坍缩(Advantage Collapsing):批次中大多数优势值集中在零附近,导致有效梯度信号被淹…

阅读更多 →
PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction 2026/11/12 15:57:44

PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction

一、文章主要内容总结 本文聚焦于利用大型语言模型(LLMs)实现个人身份信息(PII)脱敏的研究,旨在解决传统脱敏方法(如基于规则的系统、领域特定命名实体识别(NER)模型)泛化能力差、跨格式/跨语境适应性弱的问题。 研究通过全面评估多种LLM架构(包括密集型LLM(D-LLM…

阅读更多 →
LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model 2026/11/13 0:02:27

LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model

文章主要内容和创新点 主要内容 本文聚焦于二进制图像-文本相关性评估任务(判断图像与文本“相关”或“不相关”),针对该任务中文本格式多样、相关性定义随场景变化等挑战,提出了基于多模态大语言模型(MLLM)的解决方案LLaVA-RE。 模型设计:LLaVA-RE基于LLaVA 1.5架构,…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

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

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