如何解决PHP递归函数将多维数组转换为xml
我需要将不确定深度的数组转换为 xml 字符串。我认为递归函数会更好,因为数组的深度不是未知的,并且主要是 3 个级别。这是我到目前为止提出的递归函数
MoveInfo* moveinfo = malloc((numLines-1) * sizeof(MoveInfo));
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.">";
}
}
}
返回这个输出
echo array2xml([
'students' => [
'names' => [
'frank' => '12','jason' => '13','beth' => '14'
],'groups' => [
'yellow' => '165','green' => '98'
]
]
]);
如果有人能修复这个递归函数以便数组中的元素像这样打印,我将不胜感激
<students><names><frank>12</frank></names></students>
解决方法
问题是您在函数的 return
循环中使用了 foreach
,因此过早地跳出循环/函数...
当然,您也不考虑格式等;但这是一个小问题。
更新笔记
- 该函数不再使用
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 工作,只是不像人类那么容易阅读。要在新行上显示内容,请尝试在每个元素后输入回车换行符。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。