当前位置: 首页> 最新文章列表> 如何将 xml_parse 解析的 XML 数据与 array_map 配合使用

如何将 xml_parse 解析的 XML 数据与 array_map 配合使用

M66 2025-04-24

在 PHP 中,处理 XML 数据是一项常见任务,尤其是在与外部系统交互时。xml_parse 是一个底层的解析函数,而 array_map 则是一个用于批量数据转换的高阶函数。将这两个功能结合,可以有效地处理和转换批量 XML 数据,提升代码的可读性和可维护性。

下面我们将通过一个示例,演示如何实现这一目标。

示例:批量处理 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>

第一步:使用 xml_parser 解析 XML

$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(包含标签的索引位置)。

第二步:提取 item 元素

$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'],
]

第三步:使用 array_map 批量转换数据

假设我们希望对每个 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
        )
)