如何在Twig中为数组元素应用自定义phone过滤器后转JSON?
解决数组电话号码先过滤再转JSON的问题
这个问题我之前踩过坑!核心原因是你用的phone过滤器是针对单个字符串电话号码设计的——它只接收单个字符串参数,你直接把整个数组丢给它,它当然会报错说“期望字符串而非数组”啦😅
要实现需求,你需要分两步走:先给数组里的每一个元素单独应用phone过滤器,得到处理后的新数组,再把这个新数组转成JSON。下面分不同模板引擎给出具体实现:
1. Twig模板引擎(Symfony、Craft CMS等常用)
Twig自带的map过滤器就是干这个的——它能遍历数组,对每个元素执行指定逻辑,完美适配你的场景:
{{ numbersArray|map(number => number|phone)|json_encode }}
map(number => number|phone):遍历numbersArray里的每个电话号码,对它单独应用phone过滤器,返回格式化后的新数组- 最后用
json_encode把新数组转成标准JSON字符串
2. Laravel Blade模板引擎
Blade里可以借助Laravel的集合来处理,用map方法遍历处理每个元素,再转JSON:
{{ collect($numbersArray)->map(fn($number) => phone($number))->toJson() }}
注:如果你的
phone过滤器是通过自定义辅助函数实现的,直接调用phone($number)就行;如果是模型的方法,就改成$number->phone()。
3. 后端提前处理(通用方案)
如果你的模板引擎没有类似map的便捷工具,最稳妥的方式是在后端代码里先处理好数组,再传给模板:
// 后端PHP示例代码 $processedNumbers = array_map(function ($phoneNumber) { // 这里调用你的自定义phone过滤逻辑 return apply_phone_filter($phoneNumber); }, $numbersArray);
然后在模板里直接把处理好的数组转成JSON:
{{ processedNumbers|json_encode }}
或者Blade:
{{ json_encode($processedNumbers) }}
这样处理后,每个电话号码都会先经过phone过滤器格式化,再整体转成JSON,完全不会再出现类型不匹配的错误啦~
内容的提问来源于stack exchange,提问作者Magnus
相关产品推荐
相关产品推荐

