php 将xml转为数组学习记录

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值