IntlListFormatter 类在 PHP 8.5.7 中实现多语言列表自动格式化,根据 locale 自动选择分隔符、连接词与顺序规则,支持 conjunction/unit/disjunction 三种类型,无需手动拼接。

PHP 8.5.7 中的 IntlListFormatter 类让多语言列表格式化变得直观可靠,不再需要手动拼接“、”“and”“ou”等连接词——它会根据目标语言自动选择正确的分隔符、连接词和顺序规则。
支持真实语言习惯的列表连接逻辑
不同语言对“苹果、香蕉和橙子”这类列表的表达差异很大:英语用“and”,法语用“et”,中文用顿号加“和”,阿拉伯语甚至从右向左排列。IntlListFormatter 内置 ICU 数据,能准确处理这些细节:
- 自动识别 locale(如
zh_CN、fr_FR、ar_SA)并应用对应语法 - 区分“短列表”(two items)、“中列表”(three items)、“长列表”(four+ items)的不同连接策略
- 支持
type参数控制风格:unit(单位列表,如“1 kg, 2 m, 3 L”)、conjunction(默认,“A、B 和 C”)、disjunction(“或”关系,如“A 或 B 或 C”)
基本用法:三步完成本地化列表输出
无需额外依赖,只要 PHP 8.5.7 + intl 扩展启用即可使用:
- 实例化:
$formatter = new IntlListFormatter('zh_CN', IntlListFormatter::CONJUNCTION); - 传入数组:
$result = $formatter->format(['苹果', '香蕉', '橙子']); - 得到结果:
"苹果、香蕉和橙子"(中文)或"apple, banana, and orange"(en_US)
注意:数组元素必须是字符串;若含数字或对象,需提前转为字符串,IntlListFormatter 不做类型转换。
立即学习“PHP免费学习笔记(深入)”;
与传统拼接方式对比的优势
过去常用 implode(', ', $items) + 手动替换最后逗号,但这种方式在多语言场景下极易出错:
- 中文不能简单用“、”代替英文逗号,末尾需加“和”而非“&”
- 德语中三词列表用“und”,四词以上可能用“sowie”或“sowohl … als auch”结构
- 日语列表常用「・」分隔,且无固定连接词,靠语境判断
- IntlListFormatter 统一由 ICU 规则驱动,避免硬编码语言逻辑,降低维护成本
配合其他 Intl 组件构建完整国际化流程
IntlListFormatter 不是孤立工具,它天然适配现有 Intl 生态:
- 与
IntlDateFormatter结合:生成“2024年3月15日、3月22日和4月1日”的本地化日期列表 - 与
NumberFormatter配合:格式化价格列表“¥199、¥299 和 ¥399”(中文)或 “€199, €299, and €399”(de_DE) - 在 Twig/Blade 模板中封装为过滤器,如
{{ ['red', 'green', 'blue'] | list_format('fr_FR') }}
只要 locale 设置正确,整个链条保持一致的语言行为,无需为每个列表单独写适配逻辑。



















