PHP 是一種非常強大的程式語言,用於 web 開發中取得和處理資料。 XML 是一種標記語言,用於在 Web 上儲存和傳輸資料。在 PHP 中,我們可以使用陣列作為資料結構將資料儲存起來,然後將其轉換為 XML 格式。但是,有時在將 XML 轉換回 PHP 陣列時可能會遇到問題。接下來,我們將探討這個問題,並提供解決方案。
一、陣列轉 XML
在 PHP 中將陣列轉換為 XML 格式很簡單。我們只需要遍歷數組並使用 PHP 內建函數將其轉換為 XML。以下是一個範例程式碼:
<?php $data = array( 'name' => 'John', 'age' => 30, 'gender' => 'male' ); $xml = new SimpleXMLElement('<data/>'); array_walk_recursive($data, array($xml, 'addChild')); echo $xml->asXML(); ?>
輸出:
<?xml version="1.0"?> <data> <name>John</name> <age>30</age> <gender>male</gender> </data>
我們可以使用 SimpleXMLElement 類別來建立新的 XML 文件。然後將數組資料新增至 XML 標記。
二、 XML 轉數組
將 XML 轉換回 PHP 陣列相對麻煩一些。 PHP 內建函數不支援此功能。但是,SimpleXML 擴充功能提供了一種解析 XML 的方法,並將其轉換為物件。在這個物件中,我們可以使用屬性名稱來取得其值。例如,以下是一個範例XML 文件:
<?xml version="1.0"?> <data> <name>John</name> <age>30</age> <gender>male</gender> </data>
我們可以將其轉換為PHP 陣列:
輸出:
array(3) { ["name"]=> string(4) "John" ["age"]=> string(2) "30" ["gender"]=> string(4) "male" }
我們使用simplexml_load_string 函數將XML 字串轉換為SimpleXML 對象,然後使用PHP 內建json_encode 函數將其轉換為JSON 字串。最後使用 json_decode 函數將 JSON 字串轉換為陣列。
三、 XML 轉換回陣列時的問題
如果我們在將 XML 轉換為 PHP 陣列時遇到問題,這可能是因為 SimpleXML 物件的屬性名稱中包含了特殊字元。例如,以下是一個範例XML 文件:
<?xml version="1.0"?> <data> <company-name>ABC Inc.</company-name> <employees> <employee id="1">John</employee> <employee id="2">Mike</employee> </employees> </data>
以下是嘗試將此XML 轉換為PHP 陣列的範例程式碼:
輸出:
array(2) { ["company-name"]=> string(8) "ABC Inc." ["employees"]=> array(1) { ["employee"]=> array(2) { [0]=> string(4) "John" [1]=> string(4) "Mike" } } }
在輸出中, "employee" 以陣列傳回,而不是包含employee 名稱和屬性的關聯陣列。這是因為屬性名稱中的減號 "-" 會導致關聯數組的鍵名稱錯誤。例如,我們可以將 "company-name" 改為 "company_name" 然後執行相同的程式碼。以下是範例:
<?xml version="1.0"?> <data> <company_name>ABC Inc.</company_name> <employees> <employee id="1">John</employee> <employee id="2">Mike</employee> </employees> </data>
以下是輸出:
array(2) { ["company_name"]=> string(8) "ABC Inc." ["employees"]=> array(1) { ["employee"]=> array(2) { [0]=> string(4) "John" [1]=> string(4) "Mike" } } }
在這個輸出中,"employee" 作為關聯數組返回,並包括 employee 名稱和屬性。
解決此問題的方法是使用 SimpleXML 物件中的屬性名稱而不是作為鍵名稱。以下是一個帶有特殊字元的範例 XML 文件和 PHP 程式碼:
<?xml version="1.0"?> <data> <company-name>ABC Inc.</company-name> <employees> <employee id="1">John</employee> <employee id="2">Mike</employee> </employees> </data>
$value) { if ($value->count() > 0) { foreach ($value as $childKey => $childValue) { $data = array(); foreach ($childValue->attributes() as $attributeName => $attributeValue) { $data["@" . $attributeName] = (string) $attributeValue; } $data["name"] = $childValue->__toString(); if (!isset($result[$key]) || !is_array($result[$key])) { $result[$key] = array(); } array_push($result[$key], $data); } } else { $data = (string) $value; if (isset($result[$key])) { if (!is_array($result[$key])) { $result[$key] = array($result[$key]); } array_push($result[$key], $data); } else { $result[$key] = $data; } } } var_dump($result); ?>
程式碼實作了一種使用 SimpleXML 物件中的屬性名稱將 XML 轉換為 PHP 陣列的方法。在此範例中,包含屬性的 XML 標記將轉換為關聯數組。例如,以下是我們的範例XML 文件的輸出:
array(2) { ["company-name"]=> string(8) "ABC Inc." ["employees"]=> array(2) { [0]=> array(2) { ["@id"]=> string(1) "1" ["name"]=> string(4) "John" } [1]=> array(2) { ["@id"]=> string(1) "2" ["name"]=> string(4) "Mike" } } }
從輸出中可以看出,該方法正確地將屬性名稱解析為關聯數組,並將其與其他標記一起包含在同一數組中。
結論:
在 PHP 中,將陣列轉換為 XML 並將其轉換回陣列相對簡單。但是,在將 XML 轉換回 PHP 陣列時可能會遇到問題,特別是屬性名稱中包含特殊字元的情況。使用 SimpleXML 物件中的屬性名稱可以解決此問題,因為在解析 XML 時會將其轉換為關聯數組。透過了解這些訣竅,您應該能夠成功地在 PHP 中轉換 XML 和陣列之間的格式。
以上是php數組轉xml轉不回來的詳細內容。更多資訊請關注PHP中文網其他相關文章!