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

递归函数仅处理数组键<和>第一层问题及XML生成方案求助

解决带特殊包裹键的数组转XML的递归问题

嘿,我看到你在处理那些被<和>包裹键的关联数组时,递归函数只处理了第一层的键,嵌套层的键没生效对吧?这是因为你的递归调用没把处理后的嵌套数组赋值回原数组,PHP里数组默认是值传递,内层的修改不会自动同步到外层,咱们先把这个问题解决,再搞定XML生成。

第一步:修复递归键处理函数

原函数的问题在于,处理嵌套数组时只是调用了递归方法,但没把返回的处理结果存回去。修改后的函数会把每个层级的数组都正确处理并返回:

$arr = array('<Lev0_0>' => 0, '<Lev0_1>' => 1, '<Lev0_2>' => array ( '<Lev1_0>' => 2, '<Lev1_1>' => 3 ) );
print_r(RepairKeysMultidimensional($arr));

function RepairKeysMultidimensional(array $array){
    $processed = [];
    foreach($array as $key => $value){
        // 移除键上的<和>
        $cleanKey = str_replace(array('<', '>'), '', $key);
        if(is_array($value)){
            // 递归处理嵌套数组,把结果赋值给当前键
            $processed[$cleanKey] = RepairKeysMultidimensional($value);
        } else {
            $processed[$cleanKey] = $value;
        }
    }
    return $processed;
}

运行后输出的数组就完全正常了:

Array ( [Lev0_0] => 0 [Lev0_1] => 1 [Lev0_2] => Array ( [Lev1_0] => 2 [Lev1_1] => 3 ) )

第二步:从清理后的数组生成XML

接下来用PHP内置的SimpleXMLElement来生成XML,同样用递归逻辑处理嵌套结构,简单又可靠:

function arrayToXml(array $data, SimpleXMLElement $xmlNode){
    foreach($data as $key => $value){
        if(is_array($value)){
            // 嵌套数组就创建子节点,继续递归处理
            $subNode = $xmlNode->addChild($key);
            arrayToXml($value, $subNode);
        } else {
            // 普通值直接添加子节点,用htmlspecialchars转义特殊字符避免XML报错
            $xmlNode->addChild($key, htmlspecialchars($value));
        }
    }
    return $xmlNode;
}

// 先清理数组键
$cleanArray = RepairKeysMultidimensional($arr);
// 创建XML根节点,你可以改成自己需要的名称
$rootXml = new SimpleXMLElement('<root/>');
// 转换数组为XML
$finalXml = arrayToXml($cleanArray, $rootXml);
// 格式化输出XML内容
echo $finalXml->asXML();

生成的XML会是这样的:

<?xml version="1.0"?>
<root>
    <Lev0_0>0</Lev0_0>
    <Lev0_1>1</Lev0_1>
    <Lev0_2>
        <Lev1_0>2</Lev1_0>
        <Lev1_1>3</Lev1_1>
    </Lev0_2>
</root>

小提示

  • 如果你的数组值里有XML特殊字符(比如&、<),htmlspecialchars会自动转义,保证XML的合法性
  • 要是需要自定义根节点,只需要把new SimpleXMLElement('<root/>')里的root改成你想要的标签名就行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:59:25