免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1162 | 回复: 0

php数组转xml的递归实现 [复制链接]

论坛徽章:
0
发表于 2015-06-18 10:22 |显示全部楼层
PHP中奖数组转为xml的需求是常见的,而且实现方法也有很多种,百度找了一下各种实现方法,但是基本是借组一些组件啥的。我就自己写了一个字符串拼组的方法,支持多维数组。仅供参考,不足之处敬请不吝赐教!
  1. /**
  2. *   将数组转换为xml
  3. *    @param array $data    要转换的数组
  4. *   @param bool $root     是否要根节点
  5. *   @return string         xml字符串
  6. *    @author Dragondean
  7. *    @url    http://www.cnblogs.com/dragondean
  8. */
  9. function arr2xml($data, $root = true){
  10.     $str="";
  11.     if($root)$str .= "<xml>";
  12.     foreach($data as $key => $val){
  13.         if(is_array($val)){
  14.             $child = arr2xml($val, false);
  15.             $str .= "<$key>$child</$key>";
  16.         }else{
  17.             $str.= "<$key><![CDATA[$val]]></$key>";
  18.         }
  19.     }
  20.     if($root)$str .= "</xml>";
  21.     return $str;
  22. }
复制代码
上面是实现的方法,第一个参数是你要转换的数组,第二个可选参数设定是否需要加<xml>根节点,默认是需要的。

测试代码:
  1. $arr=array('a'=>'aaa','b'=>array('c'=>'1234' , 'd' => "asdfasdf"));
  2. echo arr2xml($arr);
复制代码
代码执行后的结果为:
  1. <xml><a><![CDATA[aaa]]></a><b><c><![CDATA[1234]]></c><d><![CDATA[asdfasdf]]></d></b></xml>
复制代码
更新:

在使用过程中发现下面格式的数组转换会出现问题:
  1. array(
  2.     'item' => array(
  3.         array(
  4.             'title' => 'qwe',
  5.             'description' => 'rtrt',
  6.             'picurl' => 'sdfsd',
  7.             'url' => 'ghjghj'
  8.         ),
  9.         array(
  10.             'title' => 'jyutyu',
  11.             'description' => 'werwe',
  12.             'picurl' => 'xcvxv',
  13.             'url' => 'ghjgh'
  14.         )
  15.     )
  16. );
复制代码
转换出来的结果是:
  1. <xml>
  2.     <item>
  3.         <0>
  4.             <title>
  5.                 <![CDATA[qwe]]>
  6.             </title>
  7.             <description>
  8.                 <![CDATA[rtrt]]>
  9.             </description>
  10.             <picurl>
  11.                 <![CDATA[sdfsd]]>
  12.             </picurl>
  13.             <url>
  14.                 <![CDATA[ghjghj]]>
  15.             </url>
  16.         </0>
  17.         <1>
  18.             <title>
  19.                 <![CDATA[jyutyu]]>
  20.             </title>
  21.             <description>
  22.                 <![CDATA[werwe]]>
  23.             </description>
  24.             <picurl>
  25.                 <![CDATA[xcvxv]]>
  26.             </picurl>
  27.             <url>
  28.                 <![CDATA[ghjgh]]>
  29.             </url>
  30.         </1>
  31.     </item>
  32. </xml>
复制代码
通常情况下,上面转换出来的xml整<0><1>那层节点我们是不要的。但是在php中下标有不能同名,不能有多个item。怎么办呢?

我想了一个办法就是给item下下标,比如item[0],item[1],在转换过程中在去掉[]形式的下标,实现多个item节点并排。

函数修改后如下:
  1. function arr2xml($data, $root = true){
  2.     $str="";
  3.     if($root)$str .= "<xml>";
  4.     foreach($data as $key => $val){
  5.         //去掉key中的下标[]
  6.         $key = preg_replace('/\[\d*\]/', '', $key);
  7.         if(is_array($val)){
  8.             $child = arr2xml($val, false);
  9.             $str .= "<$key>$child</$key>";
  10.         }else{
  11.             $str.= "<$key><![CDATA[$val]]></$key>";
  12.         }
  13.     }
  14.     if($root)$str .= "</xml>";
  15.     return $str;
  16. }
复制代码
那么上面需要转换的数组也需要跟着变动一下:
  1. $arr1 =array(
  2.     'item[0]' => array(
  3.             'title' => 'qwe',
  4.             'description' => 'rtrt',
  5.             'picurl' => 'sdfsd',
  6.             'url' => 'ghjghj'
  7.         ),
  8.     'item[1]' => array(
  9.             'title' => 'jyutyu',
  10.             'description' => 'werwe',
  11.             'picurl' => 'xcvxv',
  12.             'url' => 'ghjgh'
  13.         )
  14. );
复制代码
转换后的xml如下:
  1. <xml>
  2.     <item>
  3.         <title>
  4.             <![CDATA[qwe]]>
  5.         </title>
  6.         <description>
  7.             <![CDATA[rtrt]]>
  8.         </description>
  9.         <picurl>
  10.             <![CDATA[sdfsd]]>
  11.         </picurl>
  12.         <url>
  13.             <![CDATA[ghjghj]]>
  14.         </url>
  15.     </item>
  16.     <item>
  17.         <title>
  18.             <![CDATA[jyutyu]]>
  19.         </title>
  20.         <description>
  21.             <![CDATA[werwe]]>
  22.         </description>
  23.         <picurl>
  24.             <![CDATA[xcvxv]]>
  25.         </picurl>
  26.         <url>
  27.             <![CDATA[ghjgh]]>
  28.         </url>
  29.     </item>
  30. </xml>
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,7折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时七折期:2019年8月31日前


----------------------------------------

大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP