當前位置: 首頁> 最新文章列表> 如何將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
        )
)