PHP递归函数,用于将多维数组转换为xml



我需要将深度不确定的数组转换为xml字符串。我认为递归函数会更好,因为数组的深度不是未知的,而且大多是3个级别。这是我迄今为止提出的递归函数

function array2xml($data, $key = ''){
if(!is_array($data)){
return "<".$key.">".$data."</".$key.">";
}
else{
foreach($data as $key => $value){
if(!is_array($value)){
return array2xml($value, $key);
}
else{
return "<".$key.">".array2xml($value)."</".$key.">";
}
}
}

这是inital调用,但它只返回数组中的第一个元素。例如,

echo array2xml([
'students' => [
'names' => [
'frank' => '12',
'jason' => '13',
'beth' => '14'
],
'groups' => [
'yellow' => '165',
'green' => '98'
]
]
]);

返回此输出

<students><names><frank>12</frank></names></students>

如果有人能修复这个递归函数,使数组中的元素像一样打印出来,我将不胜感激

<students> 
<names>
<frankDiaz>12</frank>
<jasonVaaz>13</jason>
<bethDoe>14</beth>
</names>
<groups>
<yellow>165</yellow>
</groups>

问题是在函数的foreach循环中使用return,因此过早地脱离循环/函数。。。

当然,你也不考虑格式等因素;但这只是一个小问题。

更新说明

  • 函数不再使用echo来输出代码,而是以字符串的形式返回,该字符串可以分配给变量或自行打印
  • 添加了问题中更新的camelCase名称

代码

$array = [
'students' => [
'names' => [
'frankDiaz' => '12',
'jasonVaaz' => '13',
'bethDoe' => '14'
],
'groups' => [
'yellow' => '165',
'green' => '98'
]
]
];
function array2xml($array, $tabs = 0) {
$xml = "";
foreach ($array as $key => $arr) {
if (is_array($arr)) {
$xml .= str_repeat("    ", $tabs) . "<$key>n";
$xml .= array2xml($arr, $tabs + 1);
$xml .= str_repeat("    ", $tabs) . "</$key>n";
} else {
$xml .= str_repeat("    ", $tabs) . "<$key>$arr</$key>n";
}
}
return $xml;
}
echo array2xml($array);

输出:

<students>
<names>
<frankDiaz>12</frankDiaz>
<jasonVaaz>13</jasonVaaz>
<bethDoe>14</bethDoe>
</names>
<groups>
<yellow>165</yellow>
<green>98</green>
</groups>
</students>

上面@Steven的答案的变体,但使用simplexml:创建实际的xml

$xml_string = "";
function array2xml($array) {
global $xml_string;
foreach ($array as $key => $arr) {        
if (is_array($arr)) {            
$xml_string .=  "<$key>n";
array2xml($arr);
}
else {
$xml_string .=  "<$key>". $arr;
}
$xml_string .=  "</$key>n";        
}
}
array2xml($array);
$final = simplexml_load_string($xml_string);
echo $final->asXML();

输出仍然可以作为XML工作,只是不太容易被人类读取。若要在新行中获取内容,请尝试在每个元素之后输入回车换行符。

最新更新