Как уже упоминал Гари Томас, документация по CurrencyLayer API имеет параметр переключения исходной валюты , который позволяет вам переключать базовую валюту с USD
на любую вашу $currency1
для параметра установлено значение.
Однако, насколько я понимаю, вы хотите периодически запрашивать API-интерфейс CurrencyLayer, указав в качестве исходной валюты только 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
Вы также можете использовать денежную библиотеку, такую как 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
, использованного выше.