我目前正在开发使用PHP用户可以改变产品的钱货币,如eBay或全球速卖通做的应用程序。 因此,如果用户更改其货币兑美元的所有产品的价格都将被转换为美元。
我已经寻找了一个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;
}
快速抬起头来,因为结果看起来是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
正如加里·托马斯已经提到的,CurrencyLayer API 文档具有源货币转换参数,使您可以从转换的基础货币USD
到无论你的$currency1
参数设置为。
但是据我所知,您希望能够定期查询只与CurrencyLayer API USD
作为源货币,自己执行率计算。
要做到这一点,你需要转换:
- 从
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
你也可以使用一个钱库,如砖/钱 ,处理这些计算(和更多)为您提供:
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
上面使用。