@assets
Back-end developer

Как решит проблему с курсом валют?

Ребята помогите с кодом. Есть код который нужно вытащать актуальный курс.

В примере должен быть 76.85 тоесть USD > RUB. Но возврашает. 75.65 buy.

Как можно лучше переписать?
<?php
    
    $currency = '{
    "currency": [
            {"from":"RUB","to":"EUR","operationType":"sell","value":"92.85"},
            {"from":"RUB","to":"USD","operationType":"sell","value":"76.85"},
            {"from":"USD","to":"EUR","operationType":"sell","value":"1.1802"},
            {"from":"RUB","to":"EUR","operationType":"buy","value":"90.35"},
            {"from":"RUB","to":"USD","operationType":"buy","value":"75.65"},
            {"from":"USD","to":"EUR","operationType":"buy","value":"0.7975"}
            
        ]}';

    $rates = json_decode($currency,true);
    
    $directRate = null;
    $reversedRate = null;
    
    $amountCurrency = "USD"; // USD SELL "76.85"
    $targetCurrency = "RUB";
    foreach($rates['currency'] as $rate) {
        
    if($rate['from'] === $amountCurrency && $rate['to'] ===  $targetCurrency) {
        $directRate = $rate;
    }

    if($rate['from'] === $targetCurrency && $rate['to'] ===  $amountCurrency) {
        $reversedRate = $rate;
    }
            
}

    if ($directRate) { // На эту строку не обращать внимания
        if ($directRate['operationType'] == 'buy') {
            $amountConverted = $directRate['value'];
        } elseif ($directRate['operationType'] == 'sell') {
            $amountConverted = $directRate['value'];
        }
    }

    if ($reversedRate) { // На эту строку не обращать внимания
        if ($reversedRate['operationType'] == 'buy') {
            $amountConverted = $reversedRate['value'];
        } elseif ($directRate['operationType'] == 'sell') {
            $amountConverted = $reversedRate['value'];
        }
    }
    
    var_dump($amountConverted);
  • Вопрос задан
  • 196 просмотров
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
foreach($rates['currency'] as $rate) {
    if($rate['from'] === $amountCurrency && $rate['to'] ===  $targetCurrency) {
        $directRate = $rate;
    }
    if($rate['from'] === $targetCurrency && $rate['to'] ===  $amountCurrency) {
        $reversedRate = $rate;
    }
}
Поскольку строки с $rate['from'] === "USD" и $rate['to'] === "RUB" в массиве нету, то $directRate останется равной null.
Поскольку в массиве есть две строки с $rate['from'] === "RUB" и $rate['to'] === "USD", то в $reversedRate будет записана последняя из этих строк, {"from":"RUB","to":"USD","operationType":"buy","value":"75.65"}.
if ($directRate) {
    ....
}
Этот блок не выполнится, так как в $directRate записан null.
if ($reversedRate) { // На эту строку не обращать внимания
    if ($reversedRate['operationType'] == 'buy') {
        $amountConverted = $reversedRate['value'];
    } elseif ($directRate['operationType'] == 'sell') {
        $amountConverted = $reversedRate['value'];
    }
}
Здесь сработает ветка с $reversedRate['operationType'] == 'buy' и в $amountConverted запишется "75.65".
Всё работает в точности так, как вы написали в своей программе.
Для того, чтобы что-то переписать, надо знать, что именно вы рассчитываете получить при таких входных данных и почему.
Предположу, что в случае совпадения пары валют вам нужна ветка buy, а в случае обратного их расположения - ветка sell. Тогда будет так:
$conversionRate = null;
foreach($rates['currency'] as $rate) {
    if (($rate['operationType'] === 'buy' &&
         $rate['from'] === $amountCurrency &&
         $rate['to'] ===  $targetCurrency) ||
        ($rate['operationType'] === 'sell' &&
         $rate['from'] === $targetCurrency &&
         $rate['to'] ===  $amountCurrency)
    ) {
        $conversionRate = $rate['value'];
    }
}
var_dump($conversionRate);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы