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

Posted

技术标签:

【中文标题】PHP递归函数将多维数组转换为xml【英文标题】:PHP recursive function to convert multidimensional array to xml 【发布时间】:2021-07-19 07:49:33 【问题描述】:

我需要将一个不定深度的数组转换为一个 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.">";
        
    

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

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>

【问题讨论】:

【参考方案1】:

输出仍然作为 XML 工作,只是不那么容易被人类阅读。要在新行上添加内容,请尝试在每个元素后输入回车换行符。

【讨论】:

你的答案是什么?一个好的答案会发布如何解决问题并描述答案为何有效。【参考方案2】:

问题是您在函数的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>

【讨论】:

哇不错。这可行,但唯一的问题是我需要将 xml 分配给字符串而不是回显 另外,我需要维护文本驼峰式。检查我更新的示例。在您的代码中,它将键更改为小写 @SaeeshTendulkar 我不确定您所说的将键更改为小写时的意思。这段代码非常 wysiwyg,即如果数组有 camelCase 键,那么输出将有 camelCase 键。我添加了更新问题中的示例。希望我理解正确? @SaeeshTendulkar 我已将代码更新为 return 字符串,而不是 echo 它。现在您可以使用echo array2xml(...)$xmlString = array2xml(...) @SaeeshTendulkar 你的意思是如果你用开发工具看它? (例如,在 chrome 中右键单击和 inspect element?)这只是因为您的浏览器将标签名称更改为小写,如果您使用 view source,那么您应该可以正确看到它?【参考方案3】:

上面@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();

【讨论】:

以上是关于PHP递归函数将多维数组转换为xml的主要内容,如果未能解决你的问题,请参考以下文章

在 PHP 中递归创建多维数组

使用递归函数获取多维php数组的新值和键

如何在 PHP 中循环遍历多维数组并按名称递归删除键?

php无限极分类递归写入多维数组的方法

js递归(二)——合并多维数组

如何用php创建一个无限遍历数组,并打印