在 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
)
)