您的位置:首页 > 编程语言 > PHP开发

[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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: