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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 18:24:46