PHP4与PHP5差别之simplexml_load_string

 最近让我怨念很深的原因就是这个函数。但让我更郁闷的是搞定了这个函数后发现还有个更大的,几乎无法解决的难题。说白了就是,你这个问题解决不解决都无关紧要了。因为美丽的结果你永远无法看到……
  旧版处理XML转换成数组的方式是使用XML 语法解析函数,xml_parser_createxml_parser_set_optionxml_parse_into_struct等函数,写法比较复杂,好处是可以兼容PHP4。

[codes=php]
function xml_to_array($xml)
{
$values = array();
$index = array();
$array = array();
$parser = xml_parser_create();
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
if(0===xml_parse_into_struct($parser, $xml, $values, $index)) {
return false;
}
xml_parser_free($parser);
$i = 0;
$name = $values[$i]['tag'];
$array[$name] = isset($values[$i]['attributes']) ? $values[$i]['attributes'] : '';
$array[$name] = struct_to_array($values, $i);

return $array[$name];
}

function struct_to_array($values, &$i)
{
$child = array();
if (isset($values[$i]['value'])) array_push($child, $values[$i]['value']);

while ($i++ )) {
switch ($values[$i]['type']) {
case 'cdata':
array_push($child, $values[$i]['value']);
break;

case 'complete':
$name = $values[$i]['tag'];
if( !empty($name)){
$child[$name]= isset($values[$i]['value'])?($values[$i]['value']):'';
if(isset($values[$i]['attributes'])) {
$child[$name] = $values[$i]['attributes'];
}
}
break;

case 'open':
$name = $values[$i]['tag'];
$size = isset($child[$name]) ? sizeof($child[$name]) : 0;
$child[$name][$size] = struct_to_array($values, $i);
break;

case 'close':
return $child;
break;
}
}
return $child;
}
[/codes]

新版ThinkPHP采用了SimpleXML类库函数,仅仅使用了simplexml_load_string函数,除了写法简化不少,效率也有数量级的提高(对于大的XML数据解析尤其明显),不过只能用于PHP5以上版本。

[codes=php]
function xml_to_array($xml)
{
$array = (array)(simplexml_load_string($xml));
foreach ($array as $key=>$item){
$array[$key] = struct_to_array((array)$item);
}
return $array;
}

function struct_to_array($item) {
if(!is_string($item)) {
$item = (array)$item;
foreach ($item as $key=>$val){
$item[$key] = struct_to_array($val);
}
}
return $item;
}
[/codes]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值