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的主要内容,如果未能解决你的问题,请参考以下文章