You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
)

解决方案:调整数组赋值逻辑和输出时机

咱们先说说问题出在哪:

  1. 你用array_push把每个汇率条目单独包成一个数组再塞进$newArr,这就导致每次循环都往数组里加一个新元素,最后数组里会有149个小数组,每个小数组都只有一个货币条目,看起来就是重复出现。
  2. 你把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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 12:37:30