递归函数仅处理数组键<和>第一层问题及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
相关产品推荐
相关产品推荐

