За последние 24 часа нас посетили 36980 программистов и 7800 роботов. Сейчас ищут 1870 программистов ...

Как от числа отнять значения массива в цикле?

Тема в разделе "PHP для новичков", создана пользователем maksimovgenya, 14 окт 2022.

Метки:
  1. maksimovgenya

    maksimovgenya Активный пользователь

    С нами с:
    18 янв 2018
    Сообщения:
    3
    Симпатии:
    0
    Доброго всем времени суток

    1. Имеется число, к примеру 288641 (может быть не целым, типа 288641,64)
    2. Имеется массив вида:
    Array (
    [0] => 6094
    [1] => 6095,0001
    [2] => 6095,1
    ... ... ...
    )
    3. Необходимо от числа 288641,64 отнимать значение массива по строчно до тех пор, пока не израсходуем данное число. Итогом служит число с двумя числами после запятой, типа 7,87
     
    #1 maksimovgenya, 14 окт 2022
    Последнее редактирование: 14 окт 2022
  2. Dasderdas

    Dasderdas Новичок

    С нами с:
    29 мар 2022
    Сообщения:
    69
    Симпатии:
    0
    Будто бы задачка с код варса. Если понял правильно то вот:
    PHP:
    1. $arr = [123.32,454.0004,1233];
    2. $num = 288641.64;
    3. while ($num > 10) {
    4.   for ($i=0; $i < 2; $i++) {
    5.   if ($num - $arr[$i] < 1) {
    6.     break 2;
    7.   } else {
    8.   $num -= $arr[$i];
    9.   if ($i >= 2)
    10.   $i = 0;
    11.     }
    12.   }
    13. }
    14. $num = round($num, 2);
    15. echo $num;
    Хотя вероятно понял не правильно
     
    #2 Dasderdas, 14 окт 2022
    Последнее редактирование: 14 окт 2022
  3. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.874
    Симпатии:
    753
    Адрес:
    Татарстан
    чет замудрено... все же очевидно
    PHP:
    1. $arr = [123.32,454.0004,1233];
    2. $num = 288641.64;
    3. $i = 0;
    4. while ($num > 0) {
    5.   $num -= $arr[$i];
    6.    $i++;
    7. }
    8.  
    9. $result = $num+$arr[$i+1];
    10. echo $result;
    11. }
     
  4. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    @maksimovgenya, однако, что делать, если "строчки" массива завершаются?
    Выводить результат, или заново его обходить?
    Если нет, то всё очень просто:
    PHP:
    1. $arr = [123.32,454.0004,1233];
    2. $num = 125.64;
    3. foreach ($arr as $value) {
    4.     $tmp = $num - $value;
    5.     if ($tmp < 0) {
    6.         break;
    7.     }
    8.     $num = $tmp;
    9. }
    10. var_dump($num);
    Если да, то тоже, в общем-то не сложно :)
     
  5. maksimovgenya

    maksimovgenya Активный пользователь

    С нами с:
    18 янв 2018
    Сообщения:
    3
    Симпатии:
    0
    Не совсем понял логику Вашего примера, если честно :) , у меня получилось значение = float(99740005), а в реальности на данный момент ответ получается = 26,47

    Пришел вот к такому коду:


    PHP:
    1. $n = ($tab2_mas_gcwd_green_67_plus_sum * 100000);
    2. $A = $tab2_mas_green_67_plus;
    3. echo "Число: ", $tmp=$n, "\n\t Process...\n";
    4. $i=0;
    5. while($a = pos($A)) {
    6.   echo "\t\t $tmp - $a = ";
    7.   if ($tmp < $a) {
    8.     echo "out of range\n";
    9.     break;
    10.    }
    11.    ++$i;
    12.    echo $tmp -= $a, "\n";
    13.    next($A);
    14. }
    15. reset($A);
    16. echo "\t Result: $tmp left. Subtracted $i numbers \n";
    Ответ данного действия получил такой:

    Число: 164560 Process... 164560 - 609998000 = out of range Result: 164560 left. Subtracted 0 numbers

    Получается что:

    * Итоговая сумма от которой отнимаем = 164560 (она уже приведена к конечному виду, то есть деленная на 100000)
    * А вот сам массив идет первородный, то есть с дополнительными 5 нулями, вида 609998000

    Попытался умножить саму сумму на 100000 перед тем как отнимать от него массив, получил :

    Число: 16456000000 Process... 16456000000 - 609998000 = 15846002000 15846002000 - 610000000 = 15236002000 15236002000 - 610000000 = 14626002000 14626002000 - 610000000 = 14016002000 14016002000 - 610000000 = 13406002000 13406002000 - 615000000 = 12791002000 12791002000 - 619790000 = 12171212000 12171212000 - 619790000 = 11551422000 11551422000 - 619790000 = 10931632000 10931632000 - 619790000 = 10311842000 10311842000 - 619799990 = 9692042010 9692042010 - 619799990 = 9072242020 9072242020 - 619799990 = 8452442030 8452442030 - 619800000 = 7832642030 7832642030 - 619800000 = 7212842030 7212842030 - 619800000 = 6593042030 6593042030 - 619800000 = 5973242030 5973242030 - 619900000 = 5353342030 5353342030 - 619900000 = 4733442030 4733442030 - 619900000 = 4113542030 4113542030 - 619900000 = 3493642030 3493642030 - 619900000 = 2873742030 2873742030 - 620000000 = 2253742030 2253742030 - 623800000 = 1629942030 1629942030 - 623999000 = 1005943030 1005943030 - 624000000 = 381943030 381943030 - 624400000 = out of range Result: 381943030 left. Subtracted 26 numbers

    Итоговое число = 26 это правильно, а как получить не целое число 26, а дробное, учитывая остаток?

    К примеру какой получается остаток 381943030 от числа 624000000 - ну примерно 47%

    Что бы итог был равен = 26,47

    По факту получается, что мне нужно узнать, во сколько раз значения массива (сколько фактически сумм строк) умещается в
    первоначальное число, как я написал выше к примеру "26,47"


    Фуууу, надеюсь понятно объяснил [​IMG]
     
    #5 maksimovgenya, 14 окт 2022
    Последнее редактирование: 14 окт 2022
  6. Drunkenmunky

    Drunkenmunky Старожил

    С нами с:
    12 авг 2020
    Сообщения:
    1.511
    Симпатии:
    284
    Не совсем.
    Дайте уменьшаемое, массив вычитаемых и разность.
    А также распишите как вы её получили.
     
  7. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.874
    Симпатии:
    753
    Адрес:
    Татарстан
    Адекватно задачу сформулируйте
     
  8. antoniii

    antoniii Активный пользователь

    С нами с:
    16 мар 2022
    Сообщения:
    419
    Симпатии:
    71
    Я так понял, - отнимать нужно от исходного числа элементы массива до тех пор, пока число не станет таким, что от него уже нельзя отнять... Условие прекращения цикла число < элемента, который отнимается.
    А у автора код такой хитрый, как будто он и сам разберётся.