首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP XML 轉陣列函數 xml2array() 完整實作與用法詳解

     編輯:PHP 綜合知識

函數簽名

function xml2array(string $contents, int $get_attributes = 1, string $priority = 'tag'): array
  • $contents:XML 字串。
  • $get_attributes:1=解析屬性,0=忽略。
  • $priority:'tag' 標籤優先(預設),'attribute' 屬性優先,影響回傳陣列結構。

核心邏輯

  1. 建立 XML 解析器 xml_parser_create(),設定 UTF-8、不摺疊大小寫、略過空白。
  2. xml_parse_into_struct() 將 XML 扁平化為結構陣列(含 tag、type、level、attributes、value)。
  3. 以堆疊模擬樹狀結構重建:$parents 記錄父層引用,$opened_tags 追蹤開啟標籤,$repeated_tag_index 處理同名標籤轉陣列。
  4. 根據 $priority 決定值與屬性在結果陣列中的位置。

使用範例

$xml = file_get_contents('tools.xml');
$arr = xml2array($xml, 1, 'attribute');
print_r($arr);

輸出結構差異

priority='tag' (預設)

['book'] => [
    ['title' => '...', 'author' => '...', '_attr' => ['id' => '1']],
    ['title' => '...', ...]
]

priority='attribute'

['book'] => [
    ['attr' => ['id' => '1'], 'value' => ['title' => '...', 'author' => '...']],
    ...
]

注意事項

  • 需啟用 xml 擴展(PHP 核心內建)。
  • 大型 XML 記憶體佔用高,建議改用 XMLReader 邊讀邊轉。
  • CDATA 內容自動包含在 value 中。
  • 命名空間前綴會保留在 tag 名稱中(如 ns:tag)。

現代替代:SimpleXML + 遞迴轉陣列

function simplexmlToArray(SimpleXMLElement $xml) {
    $arr = [];
    foreach ($xml as $key => $val) {
        $arr[$key][] = $val->count() ? simplexmlToArray($val) : (string)$val;
    }
    // 屬性
    foreach ($xml->attributes() as $k => $v) $arr['@attributes'][$k] = (string)$v;
    return $arr;
}
$xml = simplexml_load_string($xmlStr);
$arr = simplexmlToArray($xml);

結語

xml2array() 展示了 SAX 事件驅動解析重建 DOM 樹的經典演算法,適合學習 XML 處理原理。生產環境優先使用 SimpleXML 或成熟庫(如 spatie/xml-to-array)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved