在PHP 中,處理XML 數據是一項常見任務,尤其是在與外部系統交互時。 xml_parse是一個底層的解析函數,而array_map則是一個用於批量數據轉換的高階函數。將這兩個功能結合,可以有效地處理和轉換批量XML 數據,提升代碼的可讀性和可維護性。
下面我們將通過一個示例,演示如何實現這一目標。
我們從一段簡單的XML 文本開始:
<items>
<item>
<id>1</id>
<name>商品A</name>
<url>http://m66.net/product/1</url>
</item>
<item>
<id>2</id>
<name>商品B</name>
<url>http://m66.net/product/2</url>
</item>
</items>
$xmlData = <<<XML
<items>
<item>
<id>1</id>
<name>商品A</name>
<url>http://m66.net/product/1</url>
</item>
<item>
<id>2</id>
<name>商品B</name>
<url>http://m66.net/product/2</url>
</item>
</items>
XML;
$parser = xml_parser_create();
xml_parse_into_struct($parser, $xmlData, $values, $index);
xml_parser_free($parser);
這會將XML 數據解析為兩個數組: $values (包含所有標籤的詳細信息)和$index (包含標籤的索引位置)。
$items = [];
foreach ($index['ITEM'] as $i => $pos) {
$item = [];
$idPos = $index['ID'][$i];
$namePos = $index['NAME'][$i];
$urlPos = $index['URL'][$i];
$item['id'] = $values[$idPos]['value'];
$item['name'] = $values[$namePos]['value'];
$item['url'] = $values[$urlPos]['value'];
$items[] = $item;
}
現在我們得到了一個整潔的數組結構,例如:
[
['id' => '1', 'name' => '商品A', 'url' => 'http://m66.net/product/1'],
['id' => '2', 'name' => '商品B', 'url' => 'http://m66.net/product/2'],
]
假設我們希望對每個URL 加上?ref=xml參數,同時將商品名稱轉為大寫,可以這樣做:
$processedItems = array_map(function($item) {
$item['name'] = strtoupper($item['name']);
$item['url'] .= '?ref=xml';
return $item;
}, $items);
最終輸出:
print_r($processedItems);
輸出結果:
Array
(
[0] => Array
(
[id] => 1
[name] => 商品A
[url] => http://m66.net/product/1?ref=xml
)
[1] => Array
(
[id] => 2
[name] => 商品B
[url] => http://m66.net/product/2?ref=xml
)
)