php数组转xml的方法:1、不使用回调函数,代码为【function outXmlFile($file, $xml_str)】;2、回调方法,生成不规则的xml,代码为【$this->arrTo_Xml($value, $key)】。
php数组转xml的方法:
方法一:原生的写法
<?php /** * 简单原生的数组转为xml * @param $arr * @return string */ function arrayToXml($arr) { $xml = "<root>"; foreach ($arr as $key => $val) { if (is_array($val)) { $xml .= "<" . $key . ">" . arrayToXml($val) . "</" . $key . ">"; } else { $xml .= "<" . $key . ">" . $val . "</" . $key . ">"; } } $xml .= "</root>"; return $xml; } $arr = array(); $arr["url"] = array( 1 => array( "loc" => "http://www.php.com/refessories/ind_10-gen_3/", "lastmod" => "2018/10/09" ), 2 => array( "loc" => "http://www.php.com/refeessories/ind_12-gen_5/", "lastmod" => "2018/10/09" ), 3 => array( "loc" => "http://www.php.com/refeessories/ind_15-gen_5/", "lastmod" => "2018/10/09" ), ); $simple_arrtoxml = arrayToXml($arr); var_dump($simple_arrtoxml); exit;
方法二:写死的方法,没有使用回调函数
/** * 把特定格式的数组转化成XML * * @param $arr array 数组格式如下 * @param string $rootNodeName 最外层节点(根节点) * @return string */ function arrToXml($arr, $rootNodeName = 'index') { $Dom = new DOMDocument('1.0', 'utf-8'); // 根节点 $root_node = $Dom->createElement($rootNodeName); $Dom->appendChild($root_node); //第一个节点 $firstNodeName = key($arr); //循环节点 foreach ($arr[$firstNodeName] as $value) { $firstNode = $Dom->createElement($firstNodeName); $root_node->appendChild($firstNode); $locNode = $Dom->createElement("loc", $value["loc"]); $firstNode->appendChild($locNode); if ($rootNodeName == 'sitemapindex') { $lastmodNode = $Dom->createElement('lastmod', $value["lastmod"]); } else { $lastmodNode = $Dom->createElement('lastmod'); $cdata = $Dom->createCDATASection($value["lastmod"]);// 生成日期特殊形式:<![CDATA[2017/09/29]]> $lastmodNode->appendChild($cdata); } $firstNode->appendChild($lastmodNode); } $Dom->formatOutput = true;//将特殊形式输出出来 $result = $Dom->saveXML(); return $result; } /** * 输出xml数据到xml文件中 * * @param $file string 文件名 * @param $xml_str * @return bool|int */ function outXmlFile($file, $xml_str) { echo "生成 ", $file, " 成功!", PHP_EOL; return file_put_contents($file, $xml_str); } /******************** 写死的方法,没有使用回调函数 **************************/ $result = array(); $result["url"] = array( 1 => array( "loc" => "http://www.php.com/refessories/ind_10-gen_3/", "lastmod" => "2018/10/09" ), 2 => array( "loc" => "http://www.php.com/refeessories/ind_12-gen_5/", "lastmod" => "2018/10/09" ), 3 => array( "loc" => "http://www.php.com/refeessories/ind_15-gen_5/", "lastmod" => "2018/10/09" ), ); $res = arrToXml($result, "ulrset"); // outXmlFile('www.baidu.com/sitic.xml', $res); // 自己选择要保存的位置 var_dump($res); exit; // ========================================================== // 结果: /** * <?xml version="1.0" encoding="utf-8"?> * <ulrset> * <url> * <loc>http://www.php.com/refessories/ind_10-gen_3/</loc> * <lastmod><![CDATA[2018/10/09]]></lastmod> * </url> * <url> * <loc>http://www.php.com/refeessories/ind_12-gen_5/</loc> * <lastmod><![CDATA[2018/10/09]]></lastmod> * </url> * <url> * <loc>http://www.php.com/refeessories/ind_15-gen_5/</loc> * <lastmod><![CDATA[2018/10/09]]></lastmod> * </url> * </ulrset> */
方法三: 回调方法,可以生成不规则的xml ( 方法调用,与方法二一样 )
/** * @param array $arr 数组 * @param int $dom Document * @param int $item * @return string */ function arr_to_xml($arr, $dom = 0, $item = 0) { if (!$dom) { $dom = new DOMDocument("1.0"); } if (!$item) { $item = $dom->createElement("root");// 根节点 $dom->appendChild($item); } foreach ($arr as $key => $val) { $itemx = $dom->createElement(is_string($key) ? $key : "item"); $item->appendChild($itemx); if (!is_array($val)) { $text = $dom->createTextNode($val);// 创建一个文本节点 $itemx->appendChild($text); } else { arr_to_xml($val, $dom, $itemx); // 自己调用自己 } } return $dom->saveXML(); } // 或者下面的这种回调方法 /** * 把特定格式的数组转化成XML * * @param $arr * @param string $nodeName xml子节点 * @param string $element * @param string $Dom * @return string */ function arrTo_Xml($arr, $nodeName = 'index', $element = '', $Dom = '') { $Dom = empty($Dom) ? new DOMDocument('1.0', 'utf-8') : $Dom; if ($element == '') { $data = $Dom->createElement($nodeName); $Dom->appendChild($data); } else { $data = $element; } foreach ($arr as $key => $value) { if (is_array($value)) { if (!is_numeric($key)) { $element = $Dom->createElement($key); $data->appendChild($element); } $this->arrTo_Xml($value, $key, $element, $Dom);// 自己调用自己 } else { if ($key == "lastmod") { $element = $Dom->createElement($key); $cdata = $Dom->createCDATASection($value); // 生成日期特殊形式:<![CDATA[2017/09/29]]> $element->appendChild($cdata); } else { $element = $Dom->createElement($key, $value);// 用createElement创建出来的都是一行(例如:<username>xingmimng</username> } $data->appendChild($element);// 创建的一行放在哪个 xml的节点下 } } $Dom->formatOutput = true;// 输出特殊形式 $result = $Dom->saveXML(); unset($Dom);// 释放资源 return $result; } // 数据结构 $result = array(); $result["url"] = array( 1 => array( "loc" => "http://www.php.com/refessories/ind_10-gen_3/", "lastmod" => "2018/10/09" ), 2 => array( "loc" => "http://www.php.com/refeessories/ind_12-gen_5/", "lastmod" => "2018/10/09" ), 3 => array( "loc" => "http://www.php.com/refeessories/ind_15-gen_5/", "lastmod" => "2018/10/09" ), ); /************************************************************************************ * 附加: xml转为array *************************************************************************************/ /** * 将xml转为array * @param string $xml * return array */ function xml_to_array($xml) { if (!$xml) { return false; } //将XML转为array //禁止引用外部xml实体 libxml_disable_entity_loader(true); $data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true); return $data; }
相关学习推荐:PHP编程从入门到精通
Atas ialah kandungan terperinci php数组如何转xml?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!