[PHP] 原生PHP使用递归方式实现数组转换成XML的功能之思考
2017-04-12 11:59
751 查看
在考虑使用PHP实现数组转换成XML文件时,读了这篇文章:http://www.cnblogs.com/dragondean/p/php-array2xml.html
作者使用递归的方式实现了数组转XML的功能。但是作者提供的function只能用于转换数组中每一项都带key的情况,如下:
$b = array('a'=>'aaa','b'=>array('c'=>'1234' , 'd' => "asdfasdf"));
如果数组中有没有key的情况,(即key为默认的0,1,2。。。)时,该funciton会将0,1这些数字作为key继续生成XML文件,最终我们会看到0,1这些结点。
作者也考虑到了该问题,于是作者提出修改数组结构,把0,1这些数字的key替换成item[0],item[1]等,然后再用preg_replace将[0],[1]这些标记去掉用以生成xml。
我个人认为这样做的话还是太麻烦了,作为转换数组为XML的方法应该可以同时兼顾这两种情况。所以我使用了array_key_exists(0,$array),来判断需要转换的数组是否具有非默认的key。如果有,则使用该key作为结点名,否则,将父类的key下方到array中的每一个单元作为子值的结点号。
$a = array(
'item' => array(
array(
'title' => 'qwe',
'description' => 'rtrt',
'picurl' => 'sdfsd',
'url' => 'ghjghj'
),
array(
'title' => 'jyutyu',
'description' => 'werwe',
'picurl' => 'xcvxv',
'url' => 'ghjgh'
)
)
);
经过这样的处理,如上的数组a,在读到item时,由于子值没有非默认key,所以在这里不会创建结点,而是将item这个key名下方到子值中,变成:
<xml>
<item>
<title><![CDATA[qwe]]></title><description><![CDATA[rtrt]]></description><picurl><![CDATA[sdfsd]]></picurl><url><![CDATA[ghjghj]]></url>
</item>
<item>
<title><![CDATA[jyutyu]]></title><description><![CDATA[werwe]]></description><picurl><![CDATA[xcvxv]]></picurl><url><![CDATA[ghjgh]]></url>
</item>
</xml>
这样我们就解决了两种不同类型的数组的转换XML的问题。代码如下:
<?php
function arr2xml($data, $root = true, $parent_key = ''){
$str="";
if($root)
$str .= "<xml>";
foreach($data as $key => $val){
// 如果key为0,1则用父key
if(is_numeric($key))
$key = $parent_key;
if(is_array($val)){
$child = arr2xml($val, false, $key);
// Shichen 2017.04.12 如果是数组
// 并且数组的key是0,1这样的,则不创建本key的结点,下放
if(array_key_exists('0',$val))
$str.= "$child";
else
$str.= "<$key>$child</$key>";
}else{
$str.= "<$key><![CDATA[$val]]></$key>";
}
}
if($root)
$str .= "</xml>";
return $str;
}
作者使用递归的方式实现了数组转XML的功能。但是作者提供的function只能用于转换数组中每一项都带key的情况,如下:
$b = array('a'=>'aaa','b'=>array('c'=>'1234' , 'd' => "asdfasdf"));
如果数组中有没有key的情况,(即key为默认的0,1,2。。。)时,该funciton会将0,1这些数字作为key继续生成XML文件,最终我们会看到0,1这些结点。
作者也考虑到了该问题,于是作者提出修改数组结构,把0,1这些数字的key替换成item[0],item[1]等,然后再用preg_replace将[0],[1]这些标记去掉用以生成xml。
我个人认为这样做的话还是太麻烦了,作为转换数组为XML的方法应该可以同时兼顾这两种情况。所以我使用了array_key_exists(0,$array),来判断需要转换的数组是否具有非默认的key。如果有,则使用该key作为结点名,否则,将父类的key下方到array中的每一个单元作为子值的结点号。
$a = array(
'item' => array(
array(
'title' => 'qwe',
'description' => 'rtrt',
'picurl' => 'sdfsd',
'url' => 'ghjghj'
),
array(
'title' => 'jyutyu',
'description' => 'werwe',
'picurl' => 'xcvxv',
'url' => 'ghjgh'
)
)
);
经过这样的处理,如上的数组a,在读到item时,由于子值没有非默认key,所以在这里不会创建结点,而是将item这个key名下方到子值中,变成:
<xml>
<item>
<title><![CDATA[qwe]]></title><description><![CDATA[rtrt]]></description><picurl><![CDATA[sdfsd]]></picurl><url><![CDATA[ghjghj]]></url>
</item>
<item>
<title><![CDATA[jyutyu]]></title><description><![CDATA[werwe]]></description><picurl><![CDATA[xcvxv]]></picurl><url><![CDATA[ghjgh]]></url>
</item>
</xml>
这样我们就解决了两种不同类型的数组的转换XML的问题。代码如下:
<?php
function arr2xml($data, $root = true, $parent_key = ''){
$str="";
if($root)
$str .= "<xml>";
foreach($data as $key => $val){
// 如果key为0,1则用父key
if(is_numeric($key))
$key = $parent_key;
if(is_array($val)){
$child = arr2xml($val, false, $key);
// Shichen 2017.04.12 如果是数组
// 并且数组的key是0,1这样的,则不创建本key的结点,下放
if(array_key_exists('0',$val))
$str.= "$child";
else
$str.= "<$key>$child</$key>";
}else{
$str.= "<$key><![CDATA[$val]]></$key>";
}
}
if($root)
$str .= "</xml>";
return $str;
}
相关文章推荐
- PHP数组与对象之间使用递归实现转换的方法
- PHP实现的数组和XML文件相互转换功能示例
- PHP数组与对象之间使用递归实现转换的方法
- PHP使用非递归方式实现猴子找大王算法
- PHP实现数组array转换成xml的方法
- 如何在不使用系统函数的情况下实现PHP中数组系统函数的功能
- php实现xml转换数组的方法示例
- PHP实现使用DOM将XML数据存入数组的方法示例
- PHP递归方式把一个数组里面的null转换为空字符串”的方法
- php实现将数组转换为XML的方法
- php数组转xml的递归实现
- PHP实现数组array转换成xml的方法
- php实现XML和数组的相互转化功能示例
- php实现xml与json之间的相互转换功能实例
- PHP使用curl请求实现post方式上传图片文件功能示例
- php实现将数组转换为XML的方法
- PHP使用header方式实现文件下载功能
- php数组转xml的递归实现
- 图片轮播系列1-旋转木马(使用JS原生数组方式实现)
- php实现xml与json之间的相互转换功能实例