You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Sabre/VObject遍历TEL属性返回TYPE不符合预期的技术咨询

解决sabre/vobject遍历VCARD TEL属性时类型重复的问题

我明白你的困扰了——这种细节上的小坑确实容易让人卡壳!咱们先拆解下问题出在哪:

你在遍历$vCard->TEL的时候,循环里用$vCard->TEL['TYPE']获取类型,这其实是直接取了第一个TEL属性的TYPE值,所以不管循环到哪条号码,输出的都是第一条的HOME,PREF。

先回顾下你的VCARD内容:

BEGIN:VCARD
TEL;TYPE=HOME,PREF:+15551234560
TEL;TYPE=HOME,FAX:+15551234569
TEL;TYPE=WORK:+155523456789
END:VCARD

还有你原本的代码:

foreach ($vCard->TEL as $number) {
    echo (string)$number . ': ' . $vCard->TEL['TYPE'] . PHP_EOL;
}

要解决这个问题,你需要从当前循环的$number对象里获取TYPE属性,而不是从整个$vCard->TEL集合里取。修改后的代码应该是这样:

foreach ($vCard->TEL as $number) {
    // 从当前的number对象中获取TYPE属性,用implode把数组转成字符串
    $types = implode(',', $number['TYPE']);
    echo (string)$number . ': ' . $types . PHP_EOL;
}

为什么这么改?因为在sabre/vobject里,每个$number都是单独的属性对象,它自己的['TYPE']会返回当前号码对应的类型数组(比如第一条是['HOME', 'PREF'],第二条是['HOME', 'FAX']),用implode把数组拼接成逗号分隔的字符串就和你预期的格式一致了。

运行修改后的代码,就能得到你想要的输出:

+15551234560: HOME,PREF
+15551234569: HOME,FAX
+155523456789: WORK

内容的提问来源于stack exchange,提问作者Black Senator

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:44:32