php數組轉xml的遞歸實現

原文:php數組轉xml的遞歸實現php

PHP中獎數組轉爲xml的需求是常見的,並且實現方法也有不少種,百度找了一下各類實現方法,可是基本是借組一些組件啥的。我就本身寫了一個字符串拼組的方法,支持多維數組。僅供參考,不足之處敬請不吝賜教!html

/**
*   將數組轉換爲xml
*    @param array $data    要轉換的數組
*   @param bool $root     是否要根節點
*   @return string         xml字符串
*    @author Dragondean
*    @url    http://www.cnblogs.com/dragondean
*/
function arr2xml($data, $root = true){
    $str="";
    if($root)$str .= "<xml>";
    foreach($data as $key => $val){
        if(is_array($val)){
            $child = arr2xml($val, false);
            $str .= "<$key>$child</$key>";
        }else{
            $str.= "<$key><![CDATA[$val]]></$key>";
        }
    }
    if($root)$str .= "</xml>";
    return $str;
}

 

上面是實現的方法,第一個參數是你要轉換的數組,第二個可選參數設定是否須要加<xml>根節點,默認是須要的。數組

測試代碼:curl

$arr=array('a'=>'aaa','b'=>array('c'=>'1234' , 'd' => "asdfasdf"));
echo arr2xml($arr);

代碼執行後的結果爲:函數

<xml><a><![CDATA[aaa]]></a><b><c><![CDATA[1234]]></c><d><![CDATA[asdfasdf]]></d></b></xml>

---------------------- ----------post

更新:測試

在使用過程當中發現下面格式的數組轉換會出現問題:url

array(
    'item' => array(
        array(
            'title' => 'qwe',
            'description' => 'rtrt',
            'picurl' => 'sdfsd',
            'url' => 'ghjghj'
        ),
        array(
            'title' => 'jyutyu',
            'description' => 'werwe',
            'picurl' => 'xcvxv',
            'url' => 'ghjgh'
        )
    )
);

 

轉換出來的結果是:spa

<xml>
    <item>
        <0>
            <title>
                <![CDATA[qwe]]>
            </title>
            <description>
                <![CDATA[rtrt]]>
            </description>
            <picurl>
                <![CDATA[sdfsd]]>
            </picurl>
            <url>
                <![CDATA[ghjghj]]>
            </url>
        </0>
        <1>
            <title>
                <![CDATA[jyutyu]]>
            </title>
            <description>
                <![CDATA[werwe]]>
            </description>
            <picurl>
                <![CDATA[xcvxv]]>
            </picurl>
            <url>
                <![CDATA[ghjgh]]>
            </url>
        </1>
    </item>
</xml>

一般狀況下,上面轉換出來的xml整<0><1>那層節點咱們是不要的。可是在php中下標有不能同名,不能有多個item。怎麼辦呢?code

我想了一個辦法就是給item下下標,好比item[0],item[1],在轉換過程當中在去掉[]形式的下標,實現多個item節點並排。

函數修改後以下:

function arr2xml($data, $root = true){
    $str="";
    if($root)$str .= "<xml>";
    foreach($data as $key => $val){
        //去掉key中的下標[]
        $key = preg_replace('/\[\d*\]/', '', $key);
        if(is_array($val)){
            $child = arr2xml($val, false);
            $str .= "<$key>$child</$key>";
        }else{
            $str.= "<$key><![CDATA[$val]]></$key>";
        }
    }
    if($root)$str .= "</xml>";
    return $str;
}

那麼上面須要轉換的數組也須要跟着變更一下:

$arr1 =array(
    'item[0]' => array(
            'title' => 'qwe',
            'description' => 'rtrt',
            'picurl' => 'sdfsd',
            'url' => 'ghjghj'
        ),
    'item[1]' => array(
            'title' => 'jyutyu',
            'description' => 'werwe',
            'picurl' => 'xcvxv',
            'url' => 'ghjgh'
        )
);

轉換後的xml以下:

<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>
相關文章
相關標籤/搜索