真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

PHP如何使用SPL庫(kù)中的對(duì)象方法進(jìn)行XML與數(shù)組的轉(zhuǎn)換

這篇文章主要介紹“PHP如何使用SPL庫(kù)中的對(duì)象方法進(jìn)行XML與數(shù)組的轉(zhuǎn)換”,在日常操作中,相信很多人在PHP如何使用SPL庫(kù)中的對(duì)象方法進(jìn)行XML與數(shù)組的轉(zhuǎn)換問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”P(pán)HP如何使用SPL庫(kù)中的對(duì)象方法進(jìn)行XML與數(shù)組的轉(zhuǎn)換”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

創(chuàng)新互聯(lián)建站專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、石城網(wǎng)絡(luò)推廣、微信平臺(tái)小程序開(kāi)發(fā)、石城網(wǎng)絡(luò)營(yíng)銷、石城企業(yè)策劃、石城品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)建站為所有大學(xué)生創(chuàng)業(yè)者提供石城建站搭建服務(wù),24小時(shí)服務(wù)熱線:028-86922220,官方網(wǎng)址:www.cdcxhl.com

雖說(shuō)現(xiàn)在很多的服務(wù)提供商都會(huì)提供 JSON 接口供我們使用,但是,還是有不少的服務(wù)依然必須使用 XML 作為接口格式,這就需要我們來(lái)對(duì) XML 格式的數(shù)據(jù)進(jìn)行解析轉(zhuǎn)換。而 PHP 中并沒(méi)有像 json_encode() 、 json_decode() 這樣的函數(shù)能夠讓我們方便地進(jìn)行轉(zhuǎn)換,所以在操作 XML 數(shù)據(jù)時(shí),大家往往都需要自己寫(xiě)代碼來(lái)實(shí)現(xiàn)。

今天,我們介紹的是使用 SPL 擴(kuò)展庫(kù)中的一些對(duì)象方法來(lái)處理 XML 數(shù)據(jù)格式的轉(zhuǎn)換。首先,我們定義一個(gè)類,就相當(dāng)于封裝一個(gè)操作 XML 數(shù)據(jù)轉(zhuǎn)換的類,方便我們將來(lái)使用。如果只是測(cè)試效果的話,直接寫(xiě)下面的函數(shù)也是可以的。

class ConvertXml{
    // ....
}

XML 轉(zhuǎn)換為 PHP 數(shù)組

class ConvertXml{
    public function xmlToArray(SimpleXMLIterator $xml): array
    {
        $res = [];

        for ($xml->rewind(); $xml->valid(); $xml->next()) {
            $a = [];
            if (!array_key_exists($xml->key(), $a)) {
                $a[$xml->key()] = [];
            }
            if ($xml->hasChildren()) {
                $a[$xml->key()][] = $this->xmlToArray($xml->current());
            } else {
                $a[$xml->key()] = (array) $xml->current()->attributes();
                $a[$xml->key()]['value'] = strval($xml->current());
            }
            $res[] = $a;
        }

        return $res;
    }

    // .....
}

$wsdl = 'http://flash.weather.com.cn/wmaps/xml/china.xml';

$xml = new SimpleXMLIterator($wsdl, 0, true);
$convert = new ConvertXml();
// var_dump($convert->xmlToArray($xml));
// array(37) {
//     [0]=>
//     array(1) {
//       ["city"]=>
//       array(2) {
//         ["@attributes"]=>
//         array(9) {
//           ["quName"]=>
//           string(9) "黑龍江"
//           ["pyName"]=>
//           string(12) "heilongjiang"
//           ["cityname"]=>
//           string(9) "哈爾濱"
//           ["state1"]=>
//           string(1) "7"
//           ["state2"]=>
//           string(1) "3"
//           ["stateDetailed"]=>
//           string(15) "小雨轉(zhuǎn)陣雨"
//           ["tem1"]=>
//           string(2) "21"
//           ["tem2"]=>
//           string(2) "16"
//           ["windState"]=>
//           string(21) "南風(fēng)6-7級(jí)轉(zhuǎn)4-5級(jí)"
//         }
//         ["value"]=>
//         string(0) ""
//       }
//     }
//     [1]=>
//     array(1) {
//       ["city"]=>
//       array(2) {

在這里,我們使用的是 SimpleXMLIterator 對(duì)象。從名稱中就可以看出,它的作用是生成可以遍歷的 SimpleXMLElement 對(duì)象。第一個(gè)參數(shù)是格式正確的 XML 文本或者鏈接地址。第二個(gè)參數(shù)是一些選項(xiàng)參數(shù),這里我們直接給 0 就可以了。第三個(gè)參數(shù)則是指明第一個(gè)參數(shù)是否是鏈接地址,這里我們給 true 。

我們?cè)诳蛻舳松闪?SimpleXMLIterator 對(duì)象,并傳遞到 xmlToArray() 方法中。這樣 SimpleXMLIterator 對(duì)象就能讓我們遍歷各個(gè)結(jié)點(diǎn)了,接下來(lái)的事情就很簡(jiǎn)單了,我們只需要判斷一下結(jié)點(diǎn)是否還有子結(jié)點(diǎn),如果有子結(jié)點(diǎn)則遞歸調(diào)用當(dāng)前這個(gè)方法。如果沒(méi)有子結(jié)點(diǎn)了,就獲取結(jié)點(diǎn)的屬性和內(nèi)容。

這個(gè)測(cè)試鏈接是獲取天氣信息的,返回的內(nèi)容中每個(gè)結(jié)點(diǎn)都只有屬性沒(méi)有內(nèi)容,體現(xiàn)在轉(zhuǎn)換后的數(shù)組中就是 value 字段都是空的。

PHP 數(shù)組或?qū)ο筠D(zhuǎn)換為 XML

class ConvertXml{

    // ......

    const UNKNOWN_KEY = 'unknow';
    
    public function arrayToXml(array $a)
    {
        $xml = new SimpleXMLElement('');
        $this->phpToXml($a, $xml);
        return $xml->asXML();
    }
    
    protected function phpToXml($value, &$xml)
    {
        $node = $value;
        if (is_object($node)) {
            $node = get_object_vars($node);
        }
        if (is_array($node)) {
            foreach ($node as $k => $v) {
                if (is_numeric($k)) {
                    $k = 'number' . $k;
                }
                if (!is_array($v) && !is_object($v)) {
                    $xml->addChild($k, $v);
                } else {
                    $newNode = $xml->addChild($k);
                    $this->phpToXml($v, $newNode);
                }
            }
        } else {
            $xml->addChild(self::UNKNOWN_KEY, $node);
        }
    }
}

var_dump($convert->arrayToXml($data));
// string(84454) "
//   ...........
// "

我們?cè)?arrayToXml() 中,先使用 SimpleXMLElement 對(duì)象創(chuàng)建了一個(gè)基本的根結(jié)點(diǎn)結(jié)構(gòu)。然后使用 phpToXml() 方法來(lái)創(chuàng)建所有結(jié)點(diǎn)。為什么要拆成兩個(gè)方法呢?因?yàn)?phpToXml() 方法是需要遞歸調(diào)用的,在每次遞歸的時(shí)候我們不需要重新的去創(chuàng)建根結(jié)點(diǎn),只需要在根結(jié)點(diǎn)下面使用 addChild() 添加子結(jié)點(diǎn)就可以了。

在 phpToXml() 的代碼中,我們還使用了 get_object_vars() 函數(shù)。就是當(dāng)傳遞進(jìn)來(lái)的數(shù)組項(xiàng)內(nèi)容是對(duì)象時(shí),通過(guò)這個(gè)函數(shù)可以獲取對(duì)象的所有屬性。如果將對(duì)象看做是一個(gè)數(shù)組的話,每個(gè)屬性值就是它的鍵值對(duì)。

在對(duì)每個(gè)鍵值遍歷時(shí),我們判斷當(dāng)前的鍵對(duì)應(yīng)的內(nèi)容是否是數(shù)組或者是對(duì)象。如果不是這兩種形式的內(nèi)容的話,就直接將當(dāng)前的內(nèi)容添加為當(dāng)前結(jié)點(diǎn)的子結(jié)點(diǎn)。如果是數(shù)組或?qū)ο蟮脑?,就繼續(xù)遞歸地添加直到數(shù)組內(nèi)容全部遍歷完成。

測(cè)試的 $data 內(nèi)容非常長(zhǎng),大家可以直接通過(guò)測(cè)試代碼的鏈接去 Github 上查閱。

總結(jié)

這篇文章的內(nèi)容是簡(jiǎn)單的學(xué)習(xí)了一個(gè) SPL 擴(kuò)展庫(kù)中對(duì)于 XML 操作的兩個(gè)對(duì)象的使用。通過(guò)它們,我們可以方便的轉(zhuǎn)換 XML 數(shù)據(jù)格式。當(dāng)然,對(duì)于 XML 的格式轉(zhuǎn)換來(lái)說(shuō),我們還有其它的方法,以后學(xué)到了再說(shuō)!

到此,關(guān)于“PHP如何使用SPL庫(kù)中的對(duì)象方法進(jìn)行XML與數(shù)組的轉(zhuǎn)換”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!


文章標(biāo)題:PHP如何使用SPL庫(kù)中的對(duì)象方法進(jìn)行XML與數(shù)組的轉(zhuǎn)換
網(wǎng)站地址:http://weahome.cn/article/jpegcj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部