我写了一个递归函数,它应该将xml转换为关联数组。 到目前为止我写的函数只使用了包含1个子元素的根元素,但是当我在xml上尝试它时,根有多个子节点,它只输出第一个子节点。
这是我写的函数:
$values
是来自xml_parse_into_struct
的值数组。
function _xml2array($append, $values, $i) {
if($i == count($values) - 1) {
return $append;
}
switch($values[$i]['type']) {
case 'open':
$tag = $values[$i]['tag'];
$append[$tag][] = _xml2array($append[$tag], $values, ++$i);
return $append;
case 'complete':
$tag = $values[$i]['tag'];
$val = $values[$i]['value'];
$append[$tag] = $val;
return _xml2array($append, $values, ++$i);
case 'close':
return $append;
}
}
function xml2array($values) {
return _xml2array(array(), $values, 0);
}
以下是我正在处理的xml:
<?xml version="1.0"?>
<espadas>
<espada>
<name>Coyote Starrk</name>
<rank>Primera</rank>
<resurreccion>
<release-command>Kick About</release-command>
<zan-name>Los Lobos</zan-name>
</resurreccion>
</espada>
<espada>
<name>Baraggan Louisenbairn</name>
<rank>Segunda</rank>
<resurreccion>
<release-command>Rot</release-command>
<zan-name>Arrogante</zan-name>
</resurreccion>
</espada>
</espadas>
以下是我得到的输出:
Array
(
[ESPADAS] => Array
(
[0] => Array
(
[ESPADA] => Array
(
[0] => Array
(
[NAME] => Coyote Starrk
[RANK] => Primera
[RESURRECCION] => Array
(
[0] => Array
(
[RELEASE-COMMAND] => Kick About
[ZAN-NAME] => Los Lobos
)
)
)
)
)
)
)
我做错了,我只生了第一个孩子? 任何形式的帮助将不胜感激。
编辑: 再次尝试调试,并意识到我需要放一个基础案例。 但是这仍然只留下了一个只有第一个孩子的阵列。
答案 0 :(得分:1)
您的代码期望编码为有一个具有相同标记名称的子元素。
$append[$tag] = _xml2array ...
这是一个错误的期望。 XML可以有0-n个子元素,具有相同的标记名称。
因此,您需要对大小写进行编码,可以有零个或多个标记名:
$append[$tag][] = _xml2array ...
由于你在complete
状态也犯了同样的错误,你也需要在那里修改你的代码,我作为一个微不足道的练习留下来在那里应用给定的答案。