PHPでは、特に外部システムと対話する場合、XMLデータの処理は一般的なタスクです。 XML_PARSEは基礎となる解析機能であり、 Array_Mapはバッチデータ変換の高次関数です。これらの2つの機能を組み合わせることで、バッチ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データが2つの配列に分析されます: $値(すべてのタグの詳細を含む)と$インデックス(タグのインデックスロケーションを含む)。
$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
)
)