En PHP, le traitement des données XML est une tâche courante, en particulier lors de l'interaction avec les systèmes externes. XML_PARSE est une fonction d'analyse sous-jacente, tandis que Array_Map est une fonction d'ordre supérieur pour la conversion des données par lots. La combinaison de ces deux fonctions peut traiter et convertir efficacement les données de XML par lots, améliorant la lisibilité et la maintenabilité du code.
Ci-dessous, nous utiliserons un exemple pour montrer comment atteindre cet objectif.
Commençons par un simple texte XML:
<items>
<item>
<id>1</id>
<name>marchandisesA</name>
<url>http://m66.net/product/1</url>
</item>
<item>
<id>2</id>
<name>marchandisesB</name>
<url>http://m66.net/product/2</url>
</item>
</items>
$xmlData = <<<XML
<items>
<item>
<id>1</id>
<name>marchandisesA</name>
<url>http://m66.net/product/1</url>
</item>
<item>
<id>2</id>
<name>marchandisesB</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);
Cela analyse les données XML en deux tableaux: $ valeurs (y compris les détails pour toutes les balises) et $ index (y compris les emplacements d'index pour les balises).
$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;
}
Maintenant, nous obtenons une structure de tableau soignée, par exemple:
[
['id' => '1', 'name' => 'marchandisesA', 'url' => 'http://m66.net/product/1'],
['id' => '2', 'name' => 'marchandisesB', 'url' => 'http://m66.net/product/2'],
]
Supposons que nous voulons ajouter le paramètre REF = XML à chaque URL et convertir le nom du produit en capitalisation, nous pouvons le faire:
$processedItems = array_map(function($item) {
$item['name'] = strtoupper($item['name']);
$item['url'] .= '?ref=xml';
return $item;
}, $items);
Sortie finale:
print_r($processedItems);
Résultat de sortie:
Array
(
[0] => Array
(
[id] => 1
[name] => marchandisesA
[url] => http://m66.net/product/1?ref=xml
)
[1] => Array
(
[id] => 2
[name] => marchandisesB
[url] => http://m66.net/product/2?ref=xml
)
)