$xml= "<name>Jack</name><age></age><school>Test University</school>";
$arr = getKeyArray($xml);
echo "<pre>";
print_r($arr);
/**
* @Content: 自己写的xml转为数组函数
*/
function getKeyArray($s_XML, $s_Keyname=''){
if($s_Keyname){
$s_StartKey = "<{$s_Keyname}>";
$s_StartKey2 = "<{$s_Keyname} ";
$s_EndKey = "</{$s_Keyname}>";
if(strpos($s_XML, "?>")!==false) $s_XML = substr($s_XML, strpos($s_XML, "?>")+2);
$i_StartPos = strpos($s_XML, $s_StartKey);
if($i_StartPos==false) $i_StartPos = strpos($s_XML, $s_StartKey2);
if($i_StartPos==false) return array();
$s_Temp = substr($s_XML, $i_StartPos);
$s_Temp = substr($s_Temp, 0, strrpos($s_Temp, $s_EndKey)+strlen($s_EndKey));
}else $s_Temp = $s_XML;
return nice_xml_to_array($s_Temp);
}
/**
* @Content: 使用字符串的方式来把xml转为数组,这里是忽略了属性,所以如果是要用到属性的,不能用这个函数
*/
function nice_xml_to_array($xml){
$i = 0;
$retarr = array();
while(true){
$xml = trim($xml);
preg_match_all( "/\<(.*?)\>(.*?)/s", $xml, $arr);
if(!empty($arr[0][0])){
$key1 = $arr[0][0];
if(strpos($key1, " ")!==false){
$key1 = substr($key1, 0, strpos($key1, " ")).">";
}
$key2 = "</".substr($key1, 1);
$keyname = substr($key1, 1, -1);
$xml2 = substr($xml, strpos($xml, ">")+1);
$xml2 = substr($xml2, 0, strpos($xml2, $key2));
$xml = substr($xml, strpos($xml, $key2)+strlen($key2));
if(strpos($xml2, "</")!==false){
$setarr = nice_xml_to_array($xml2);
}else $setarr = $xml2;
if(!empty($retarr[$keyname])){
if(is_array($retarr[$keyname]) && $retarr[$keyname][0]) $retarr[$keyname][] = $setarr;
else $retarr[$keyname] = array($retarr[$keyname], $setarr);
}else{
$retarr[$keyname] = $setarr;
}
$i++;
if($i>10000) break; //避免死循环
}else{
break;
}
}
return $retarr;
}