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
相关产品推荐
相关产品推荐

