PHP: получение проблемы с вычислениями в цикле for - PullRequest
0 голосов
/ 15 января 2020

Извините за этот глупый вопрос. Я хочу потратить 25 кредитов, мой доступный кредит составляет 30 (10,10,10). Но в приведенном ниже примере кода конечная сумма получает значение минус (-) 5 вместо 5. Не могли бы вы проверить мой код, фактический вывод и ожидаемый результат:

Код:

<?php
$content_credit = 25;
$data = array(10,10,10);
$used_credit = 0;
for($i=0; $i<count($data); $i++){
    if($content_credit > $used_credit){
        $used_credit += $data[$i];
        echo "Point: " . $data[$i];
        echo " Used: " . $used_credit;
        echo " Remaining: " . ($content_credit - $used_credit);
    }
    echo "<br>";
}

Фактический результат:

Point: 10 Used: 10 Remaining: 15
Point: 10 Used: 20 Remaining: 5
Point: 10 Used: 30 Remaining: -5

Ожидаемый результат:

Point: 10 Used: 10 Remaining: 15
Point: 10 Used: 20 Remaining: 5
Point: 10 Used: 25 Remaining: 5

Ответы [ 3 ]

2 голосов
/ 15 января 2020

$content_credit в первой итерации становится 10, затем во второй она становится 20 из-за +=.

Следовательно, 25 - 10 - 20 = -5

1 голос
/ 15 января 2020
<?php
$credit_to_spend = 25;
$available_credit = array(10,10,10);
$used_credit = 0;

for( $i=0; $i<count($available_credit); $i++ ){
    if( $credit_to_spend > $used_credit ){

        $required = ($credit_to_spend - $used_credit);
        $used_credit += ($required < $available_credit[$i]) ? $required : $available_credit[$i];
        $remaining = (($required < $available_credit[$i]) ? ($available_credit[$i] - $required): ($credit_to_spend - $used_credit));

        echo "Point: " . $available_credit[$i] 
        . " Used: " . $used_credit 
        . " Remaining: " . $remaining;
    }
    echo "<br>";
}
1 голос
/ 15 января 2020

Вы, вероятно, ищете что-то вроде:

<?php
$content_credit = 25;
$data = array(10,10,10);
$total = array_sum($data);
$used_credit = 0;
for($i=0; $i<count($data); $i++){
    if($content_credit > $used_credit){
        $used_credit += $data[$i];
        echo "Point: " . $data[$i];
        echo " Used: " . $used_credit;
        $remaining = $used_credit > $content_credit ? $total - $content_credit :  $total - $used_credit;
        echo " Remaining: " . $remaining;
    }
    echo "<br>";
}

Вам необходимо знать, сколько всего у вас кредитов для расчета остатков.

Чтобы получить сумму фактического использованного кредита достаточно знать, какое значение меньше между $used_credit и $content_credit. Таким образом, вы можете использовать min() для получения значения.

echo " Used: " . min($used_credit, $content_credit);

Аналогично $remaining можно заменить значением max() результатов троичного оператора или простым вычислением $total - $actual_used.

echo " Remaining: " . max($total - $content_credit,  $total - $used_credit);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...