php陣列轉xml的遞迴實現

傑克.陳發表於2015-06-26

原文:php陣列轉xml的遞迴實現

PHP中獎陣列轉為xml的需求是常見的,而且實現方法也有很多種,百度找了一下各種實現方法,但是基本是借組一些元件啥的。我就自己寫了一個字串拼組的方法,支援多維陣列。僅供參考,不足之處敬請不吝賜教!

/**
*   將陣列轉換為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>根節點,預設是需要的。

測試程式碼:

$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>

———————- ———-

更新:

在使用過程中發現下面格式的陣列轉換會出現問題:

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

 

轉換出來的結果是:

<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。怎麼辦呢?

我想了一個辦法就是給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>

 


相關文章