我目前正在开发一个使用PHP的应用程序,用户可以更改产品的货币,如ebay或aliexpress。因此,如果用户将其货币更改为美元,则所有产品价格将转换为美元。
我搜索了一个API来获取名为CurrencyLayer的实时货币。 API提供以下结构:
"success": true,
"terms": "https://currencylayer.com/terms",
"privacy": "https://currencylayer.com/privacy",
"timestamp": 1432480209,
"source": "USD",
"quotes": {
"USDAED": 3.67315,
"USDAFN": 60.790001,
"USDALL": 126.194504,
"USDAMD": 477.359985,
"USDANG": 1.790403,
[...]
}
我的计划是每小时在我的数据库中保存此引号。考虑到转换货币的函数,将一个转换为另一个的正确算法是什么?我知道这并不难,但我无法理解。
function convertCurrency($currency1 = 'USD', $currency2 = 'EUR', $value){
//Search the currency value and algorithm to convert
$newValue = (????)
return $newValue;
}
答案 0 :(得分:1)
快速抬头,因为结果看起来是JSON格式,你首先可能想要在结果上调用json_decode以获得PHP对象格式。
json_decode之后的API示例如下所示:
// var_dump($api_result)
stdClass Object
(
[success] => 1
[terms] => https://currencylayer.com/terms
[privacy] => https://currencylayer.com/privacy
[timestamp] => 1432480209
[source] => USD
[quotes] => stdClass Object
(
[USDAED] => 3.67315
[USDAFN] => 60.790001
[USDALL] => 126.194504
[USDAMD] => 477.359985
[USDANG] => 1.790403
)
)
下一步是使用您的函数组合两个参数来访问(例如)USDAED结果:
<?php
function convertCurrency($currency1 = 'USD', $currency2 = 'EUR', $value) {
//Search the currency value and algorithm to convert
$combined_currencies = $currency1.$currency2;
return $api_result->quotes->$combined_currencies * $value;
}
echo convertCurrency("USD", "AED", 1); // 3.67315
答案 1 :(得分:1)
正如Gary Thomas已经提到的,CurrencyLayer API documentation有一个源货币转换参数,允许您将基础货币从USD
切换到您的$currency1
1}}参数设置为。
但据我所知,您希望能够定期查询仅使用USD
作为源货币的CurrencyLayer API,并自行执行费率计算。
要实现这一目标,您需要转换:
CURRENCY 1
到USD
USD
到CURRENCY 2
将代码转换为:
function convertCurrency($currency1, $currency2, $value)
{
$baseCurrency = 'USD';
$quotes = [
'USDCAD' => 1.28024,
'USDEUR' => 0.838313,
// ...
];
$quote1 = $quotes[$baseCurrency . $currency1];
$quote2 = $quotes[$baseCurrency . $currency2];
return $value / $quote1 * $quote2;
}
convertCurrency('EUR', 'CAD', 10); // 15.271622890257
您还可以使用资金库,例如brick/money,为您处理这些计算(以及更多):
use Brick\Math\RoundingMode;
use Brick\Money\CurrencyConverter;
use Brick\Money\ExchangeRateProvider\ConfigurableProvider;
use Brick\Money\ExchangeRateProvider\BaseCurrencyProvider;
use Brick\Money\Money;
$provider = new ConfigurableProvider();
$provider->setExchangeRate('USD', 'CAD', 1.28024);
$provider->setExchangeRate('USD', 'EUR', 0.838313);
// This is where the magic happens!
$provider = new BaseCurrencyProvider($provider, 'USD');
$converter = new CurrencyConverter($provider);
$money = Money::of(10, 'EUR');
$converter->convert($money, 'CAD', RoundingMode::DOWN); // CAD 15.27
BaseCurrencyProvider
是为此目的而设计的,当您有一个相对于单一货币的汇率列表,并希望在列表中的两种任意货币之间进行转换。
请注意,在真实应用中,您可能会使用PDOProvider直接从数据库加载汇率,而不是上面使用的ConfigurableProvider
。