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 工作,只是不像人类那么容易阅读。要在新行上显示内容,请尝试在每个元素后输入回车换行符。