PHP修改array_to_xml函数生成平级重复kontakt XML节点
问题根因
现有代码处理kontakt字段时逻辑存在偏差:
- 检测到键名为
kontakt时,会先创建1个外层<kontakt>父节点 - 随后遍历
kontakt对应的数字索引数组,把数字索引1/2作为子节点名,生成<1>、<2>这类非法节点嵌套在外层<kontakt>下,和预期的平级节点结构不符。
修改方案
不需要保留外层<kontakt>父节点,遍历kontakt数组的每一项时,直接在当前XML层级为每一项生成独立的同名<kontakt>节点,再复用已有的属性、值填充逻辑即可。
替换原函数中普通数组分支的冗余kontakt判断逻辑,修改后的完整函数代码如下:
function array_to_xml( $data, &$xml_data ) { foreach( $data as $key => $value ) { if (!empty($value)) { if( is_array($value)) { if (!empty($value["@attributes"])) { // 处理带属性的单个节点 $subnode = $xml_data->addChild($key, $value["@value"]); foreach ($value["@attributes"] as $key1 => $val1) { $subnode->addAttribute($key1, $val1); } } else if ($key == "@value") { foreach ($value as $attr => $attrVal) { $subnode = $xml_data->addChild("$attr", $attrVal); array_to_xml($attrVal, $subnode); } } else { if ($key == "kontakt") { // 处理平级重复同名节点,不创建外层父节点 foreach ($value as $contactItem) { $subnode = $xml_data->addChild($key, $contactItem['@value']); // 追加节点属性 if (!empty($contactItem['@attributes'])) { foreach ($contactItem['@attributes'] as $attrKey => $attrVal) { $subnode->addAttribute($attrKey, $attrVal); } } // 若节点存在子结构则递归处理 array_to_xml($contactItem, $subnode); } } else { // 普通数组节点正常生成父节点后递归 $subnode = $xml_data->addChild($key); array_to_xml($value, $subnode); } } } else { $xml_data->addChild("$key",$value); } } } }
效果验证
传入你给出的kontakt数组结构,转换后输出的XML片段如下,完全匹配预期:
<kontakt typ="email">abc@abc.pl</kontakt> <kontakt typ="telefon">3123453141</kontakt>
注:如果后续还有其他需要生成平级重复同名节点的字段,可以把字段名统一放到配置列表中判断,无需硬编码kontakt字段名。
内容的提问来源于stack exchange,提问作者Krzysztof
相关产品推荐
相关产品推荐

