Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Округлить числа

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Округлить числа
Wet
Отправлено: 29 Июня, 2016 - 10:23:09
Post Id



Новичок


Покинул форум
Сообщений всего: 17
Дата рег-ции: Дек. 2012  


Помог: 0 раз(а)




Есть массив
PHP:
скопировать код в буфер обмена
  1.   0 => 1500,
  2.   1 => 500,
  3.   2 => 2000,
  4.   3 => 7000,
  5.   4 => 10000
  6. )
Задача: подсчитать значения по порядку (по ключам от 0-4) и округлить с условием:
1) если значение < 5400, то округляем до 3600
2) если значение < 7200 и >= 5400, то округляем до 7200
Все что не входит в условие исключаем.

Там получается мы должны складывать значения до тех пор, пока не дойдет до 7200. Т.е. если складывать 1500+500+2000=4000 и если еще прибавить 7000, то превысит наш лимит, значит нужно сохранить 4000 и по новой начать считать. Следом идет 7000 (после 2000), берем ее складываем со след значением 7000+10000=17000(как видим снова превышает наш лимит, значит снова сохраняем 7000 и берем след значение 10000). 10000 не проходит по нашим условиям, значит исключаем.

На выходе должны получить такой массив

(Отредактировано автором: 29 Июня, 2016 - 10:26:08)

 
 Top
Prizma
Отправлено: 29 Июня, 2016 - 12:51:32
Post Id



Посетитель


Покинул форум
Сообщений всего: 463
Дата рег-ции: Июнь 2012  
Откуда: Санкт-Петербург


Помог: 5 раз(а)




Wet пишет:
Задача: подсчитать значения по порядку (по ключам от 0-4) и округлить с условием:
1) если значение < 5400, то округляем до 3600
2) если значение < 7200 и >= 5400, то округляем до 7200
Wet пишет:
На выходе должны получить такой массив
PHP:
скопировать код в буфер обмена
array (
  0 => 4000,
  1 => 7000
)

Вы противоречите сами себе, как на выходе может быть такой массив, если мы все результирующий значения будет округлять до 3600, 7200 или исключать?

Вот так у меня получилось:
PHP:
скопировать код в буфер обмена
  1. function addInArray($value, &$array)
  2. {
  3.         if($value < 5400) {
  4.                 $array[] = 3600;
  5.         }elseif($value < 7200) {
  6.                 $array[] = 7200;
  7.         }
  8. }
  9.  
  10. const MAX = 7200;
  11. $ar = array (
  12.         0 => 1500,
  13.         1 => 500,
  14.         2 => 2000,
  15.         3 => 7000,
  16.         4 => 10000
  17. );
  18. $length = count($ar);
  19. $re = [];
  20. if($length > 0) {
  21.         $s = $ar[0];
  22.         for ($i = 1; $i < $length; $i++) {
  23.                 $value = $ar[$i];
  24.                 if (($s + $value) > MAX) {
  25.                         addInArray($s, $re);
  26.                         $s = $value;
  27.                 }else{
  28.                         $s += $value;
  29.                 }
  30.         }
  31.         addInArray($s, $re);
  32. }
  33. var_dump($re);

На выходе
Цитата:
array (size=2)
0 => int 3600
1 => int 7200

Если не выполнять первые 2 условия, а действовать по иному "вашему" алгоритму описанному ниже, тогда получается 4000 7000 для этого просто поправим функцию, в которой в принципе больше и не будет надобности:
PHP:
скопировать код в буфер обмена
  1. function addInArray($value, &$array)
  2. {
  3.         if($value < 7200) {
  4.                 $array[] = $value;
  5.         }
  6. }
  7.  
  8. const MAX = 7200;
  9. $ar = array (
  10.         0 => 1500,
  11.         1 => 500,
  12.         2 => 2000,
  13.         3 => 7000,
  14.         4 => 10000
  15. );
  16. $length = count($ar);
  17. $re = [];
  18. if($length > 0) {
  19.         $s = $ar[0];
  20.         for ($i = 1; $i < $length; $i++) {
  21.                 $value = $ar[$i];
  22.                 if (($s + $value) > MAX) {
  23.                         addInArray($s, $re);
  24.                         $s = $value;
  25.                 }else{
  26.                         $s += $value;
  27.                 }
  28.         }
  29.         addInArray($s, $re);
  30. }
  31. var_dump($re);

На выходе:
Цитата:
array (size=2)
0 => int 4000
1 => int 7000

(Отредактировано автором: 29 Июня, 2016 - 12:58:49)

 
My status
 Top
Wet
Отправлено: 30 Июня, 2016 - 02:10:57
Post Id



Новичок


Покинул форум
Сообщений всего: 17
Дата рег-ции: Дек. 2012  


Помог: 0 раз(а)




Prizma пишет:

Вы противоречите сами себе, как на выходе может быть такой массив, если мы все результирующий значения будет округлять до 3600, 7200 или исключать?
Да, не правильно объяснил Радость Я имел ввиду что при сложении должны получить
PHP:
скопировать код в буфер обмена
  1.     array (
  2.       0 => 4000,
  3.       1 => 7000
  4.     )
А при округлении (конечный результат)
PHP:
скопировать код в буфер обмена
  1.     array (
  2.       0 => 3600,
  3.       1 => 7200
  4.     )
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB