PHP处理FloatRates XML数据:生成指定键值结构并解决重复问题
问题:修正汇率数据数组结构并解决重复生成问题
我现在用这段代码获取汇率数据:
$xml = simplexml_load_file('http://www.floatrates.com/daily/gel.xml'); $cur = array($xml); $array = json_decode(json_encode($cur), true); $newArr = []; foreach ($array as $value) { foreach($value['item'] as $key){ array_push($newArr, [ $key['targetCurrency'] => $key ]); print '<pre>'; print_r($newArr); print '</pre>'; } }
现在输出的问题是,每个汇率条目(比如[USD] => Array)会重复出现149次,我想要改成这样的结构:
[USD] => Array ( [title] => 1 GEL = 0.32613048 USD [link] => http://www.floatrates.com/gel/usd/ [description] => 1 Georgian lari = 0.32613048 U.S. Dollar [pubDate] => Thu, 9 Jul 2020 12:00:01 GMT [baseCurrency] => GEL [baseName] => Georgian lari [targetCurrency] => USD [targetName] => U.S. Dollar [exchangeRate] => 0.32613048 [inverseRate] => 3.06625741 [inverseDescription] => 1 U.S. Dollar = 3.06625741 Georgian lari ) [EUR] => Array ( [title] => 1 GEL = 0.28808543 EUR [link] => http://www.floatrates.com/gel/eur/ [description] => 1 Georgian lari = 0.28808543 Euro [pubDate] => Thu, 9 Jul 2020 12:00:01 GMT [baseCurrency] => GEL [baseName] => Georgian lari [targetCurrency] => EUR [targetName] => Euro [exchangeRate] => 0.28808543 [inverseRate] => 3.47119257 [inverseDescription] => 1 Euro = 3.47119257 Georgian lari )
解决方案:调整数组赋值逻辑和输出时机
咱们先说说问题出在哪:
- 你用
array_push把每个汇率条目单独包成一个数组再塞进$newArr,这就导致每次循环都往数组里加一个新元素,最后数组里会有149个小数组,每个小数组都只有一个货币条目,看起来就是重复出现。 - 你把
print_r放在内层循环里,每次循环都输出一遍当前的$newArr,自然会看到重复的条目不断累加。
直接看修改后的代码:
$xml = simplexml_load_file('http://www.floatrates.com/daily/gel.xml'); // 去掉多余的数组包裹,直接把SimpleXML对象转成数组 $array = json_decode(json_encode($xml), true); $newArr = []; // 遍历每个汇率条目,把目标货币代码作为数组的键 foreach($array['item'] as $item){ $newArr[$item['targetCurrency']] = $item; } // 等所有条目都处理完,再一次性输出结果 print '<pre>'; print_r($newArr); print '</pre>';
为啥这么改?
- 删掉了
$cur = array($xml);这一步,因为simplexml_load_file返回的对象直接转数组就可以用,包一层数组反而多了没必要的嵌套。 - 用
$newArr[$item['targetCurrency']] = $item来赋值,相当于把每个货币条目直接挂在对应的货币代码键下,这样每个货币只会存一次,不会重复。 - 把输出代码移到循环外面,等所有数据都处理完再打印,就能得到你想要的那种以货币代码为键的结构,不会有重复内容。
这样改完之后,输出的结构就和你给的示例完全一致,重复问题也解决啦。
内容的提问来源于stack exchange,提问作者dominic
相关产品推荐
相关产品推荐

