За последние 24 часа нас посетили 26894 программиста и 1814 роботов. Сейчас ищут 1377 программистов ...

Как подсчитать сумму переменной из цикла?

Тема в разделе "PHP для новичков", создана пользователем ekip, 11 фев 2010.

  1. ekip

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

    С нами с:
    11 авг 2009
    Сообщения:
    118
    Симпатии:
    0
    Подскажите как подсчитать сумму переменной из цикла?
    побывал пользоваться оператором присваивания += но ничего хорошего не выходит.
     
  2. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Как пробовал?
     
  3. ekip

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

    С нами с:
    11 авг 2009
    Сообщения:
    118
    Симпатии:
    0
    PHP:
    1.  
    2. <?php
    3.  while($arr = mysql_fetch_array($result)){
    4. $a = $arr['summa']
    5. $a += $a;
    6. echo $a;
    7.  }
    8. ?>
    9.  
    складывает так $a = $a + $a ( где $a = 12 )
    echo $a; выводит 24
    и так каждую ячейку из поля summa,
    24 ( ячейке 12)
    16 ( в ячейке 8)
    20 ( в ячейке 10)
    А нужно бы сложить полученную переменную $a результата выполнения цикла, т.е.
    12+8 = 20
    20+10 =30
    и.т.д и получить конечный результат, сразу оговорюсь что SUM(summa) в mysql запросе не подходит.
     
  4. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    1. Ты постоянно перезаписываешь сумму
    2. $a += $b
      это экивалент
      $a = $a + $b

      А теперь посмотри на то, как ты его применяешь и что в итоге получаешь?
     
  5. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    На самом деле наверняка подходит, просто ты скорее всего неправильно составляешь запрос.

    Хотя, исключения конечно бывают - но редко :)
     
  6. ekip

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

    С нами с:
    11 авг 2009
    Сообщения:
    118
    Симпатии:
    0
    PHP:
    1. <?php
    2. $result = mysql_query("SELECT SUM(oplata),zayavka,number  FROM data_oplata WHERE izdanie = ".$izdanie." AND(`number` LIKE '%$numbs%' OR `number` LIKE '%$numbs%') GROUP by zayavka");
    3. while($arr = mysql_fetch_array($result))
    4. {
    5. $zapopl = substr_count($arr['number'], ','); // Подсчитали кол-во запятых (в поле например 01,02,04,05 а может быть и  только 01,)
    6. $sumsopl = $arr['SUM(oplata)']; // Получили суммарный массив отсортированный по $izdanie и содержащий к примеру 01, и сгпупированный по полю zayavka преобразовали в переменную $sumsopl
    7. $itogsumoplata = $sumsopl / $zapopl; // Получили оплату по искомому нами номеру в поле number разделив ровно на кол разделителей (,) в поле number               
    8. echo " <font color='#99cc00'>".$itogsumoplata."</font> руб."; // Вывели
    9. // после этого я хотел с помощью оператора присваивания получить сумму переменной $itogsumoplata и выкинуть его за пределы цикла, так что бы он показал последний результат сложения не в цикле
    10. $itogsumoplata += $itogsumoplata;
    11. }
    12. echo $itogsumoplata;
    13. ?>
     
  7. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Этой конструкции я вообще не понял

    Код сумбурный. Можно на словах конечную цель всех манипуляций? (не подсчитать сумму, а для чего это все делается?)
     
  8. ekip

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

    С нами с:
    11 авг 2009
    Сообщения:
    118
    Симпатии:
    0
    PHP:
    1. <?php
    2. $izdanie = $_GET['izdanie']; // входящие данные "издание"
    3. $numbs = $_GET['number']; // входящие данные "номер"
    4.  
    5. $result = mysql_query("SELECT SUM(oplata),zayavka,number  FROM data_oplata WHERE izdanie = ".$izdanie." AND(`number` LIKE '%$numbs%' OR `number` LIKE '%$numbs%') GROUP by zayavka"); // Выделяем поля oplata (суммировать),zayavka,number в таблице data_oplata только izdanie = ".$izdanie." и выбираем значения равные нашему $numbs после чего сгруппировавшем по номеру заявки в книжном магазине.
    6. ?>
     
  9. ekip

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

    С нами с:
    11 авг 2009
    Сообщения:
    118
    Симпатии:
    0
  10. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Это все хорошо, но картину до конца не проясняет.

    Что нужно?
    Посчитать сколько было заявок и за сколько заплатили?
    Посчитать общую сумму оплаты по клиенту?
    Посчитать общую сумму оплаты по номеру от всех клиентов?
     
  11. ekip

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

    С нами с:
    11 авг 2009
    Сообщения:
    118
    Симпатии:
    0
    Все работает идеально, единственное что остается это вывести сумму (оплата за номер), в виду геморройного принципа действия электронного магазина упростить или пересмотреть принцип связки таблиц невозможно, поэтому приходится сначала что то суммировать запросом mysql прямо в цикле выполнять действия и выводить результат.
     
  12. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Что мешает это сделать влоб?

    [sql]SELECT SUM(`oplata`) FROM `data_oplata` WHERE `izdanie` = 'чему-то' AND `number` LIKE 'чего-то'
    GROUP BY `izdanie`, `number`
    [/sql]
     
  13. ekip

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

    С нами с:
    11 авг 2009
    Сообщения:
    118
    Симпатии:
    0
    [​IMG]
    Например номер заявки 360, по ней может существовать несколько оплат
    под разными id в таблице data_oplata, но мы их группируем по номеру
    заявки, так как она может быть не до конца проплачена,
    Запись id 400 имеет платеж 288 руб, это за номера 08 и 18, но
    мы сортировали только 18 номер, что бы узнать сколько унас проплачено за
    18 номер мы делим нашу оплату на количество номеров (так как
    расчет в оплату вноситься формулами и со всяческими скидками)
    получаем оплату 144 руб, если у нас существовала еще проплата
    по номеру 18 и по той же заявке оплата так же рассчитывается и суммируется,
    аналогично поступаем с заявкой № 401
     
  14. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Намудрили. При таком подходе к оплате за номера.... Дельного будет крайне мало.
    Простой пример.

    Что произойдет если номер стоит 200 руб, я заплатил 288 за 2 номера (08, 18). Т.е. один полностью, а один на 88 руб. Как это посчитается? Поделится пополам? по 144?
    А в следующий раз я заплачу 312 руб за 2 номера (18, 28). Т.е. доплачу 112 за 18й и 200 за 28й. У тебя опять поделится пополам на два номера?
    Итого 08й = 144 руб, 18й = 144 руб + 156 руб, 28й = 156 руб.
    А номер то, стоит 200 руб.

    Рекомендую расщеплять платежи сразу при поступлении и записывать в базу (в одну таблицу просто платежи, во вторую уже расщепленые по номерам). Причем расщеплять именно по стоимости номеров. Т.е из 288 рублей за 2 номера, сначала оплачивается 1й номер полностью, а остаток суммы записываеться как платеж за 2й номер.
    Выборки будут крайне тривиальные.
     
  15. ekip

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

    С нами с:
    11 авг 2009
    Сообщения:
    118
    Симпатии:
    0
    В поле оплата стоит проверка, нельзя заплатить свыше стоимости 1 номера (фиксированная сумма)
    Чекбоксами указываете номера, java передает в поле разрешенное кол-во оплаты,
    т.е. 200 можно заплатить только отельной проплатой т.е. за 1 номер
    Остальные 88 руб вы кидаете с баланса клиента не фиксированной суммой на 2-й номер,
    в следующий раз скрипт вам скажет что по этой заявке вы можете оплатить всего лишь 112 руб.
    а выше описанный скрипт как раз таки все считает и суммирует.
    Так как валидация работает нормально ошибок никаких не возникает, потому как пришлось создавать отдельные балансы клиентов.
    Была идея расщеплять 1 заявку на несколько заявок по клиенту, но это выглядит громоздко, учитывая то что в заявке может быть аж 60 номеров а за сутки заявок около 400.
     
  16. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Тогда каким образом оно попадает в базу в виде общей суммы и списка номеров в одной записи?
    Почему из этого не формируются две записи оплаты под одну заявку?

    Не надо расщеплять заявку.
    Надо расщеплять оплату. И хранить расщепление отдельно.
    Тогда не будет изысков с такой логикой суммирования.

    Вобщем, если есть желание бодаться с таким алгоритмом - ради бога. Ошибку почему не суммирует, я тебе указал.

     
  17. ekip

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

    С нами с:
    11 авг 2009
    Сообщения:
    118
    Симпатии:
    0
    PHP:
    1. <?php
    2. $result = mysql_query("SELECT SUM(oplata),zayavka,number  FROM data_oplata WHERE izdanie = ".$izdanie." AND(`number` LIKE '%$numbs%' OR `number` LIKE '%$numbs%') GROUP by zayavka");
    3. while($arr = mysql_fetch_array($result))
    4. {
    5. $zapopl = substr_count($arr['number'], ','); // Подсчитали кол-во запятых (в поле например 01,02,04,05 а может быть и  только 01,)
    6. $sumsopl = $arr['SUM(oplata)']; // Получили суммарный массив отсортированный по $izdanie и содержащий к примеру 01, и сгпупированный по полю zayavka преобразовали в переменную $sumsopl
    7. $itogsumoplata = $sumsopl / $zapopl; // Получили оплату по искомому нами номеру в поле number разделив ровно на кол разделителей (,) в поле number               
    8. echo " <font color='#99cc00'>".$itogsumoplata."</font> руб."; // Вывели
    9. // после этого я хотел с помощью оператора присваивания получить сумму переменной $itogsumoplata и выкинуть его за пределы цикла, так что бы он показал последний результат сложения не в цикле
    10. $sumoplata += $itogsumoplata;
    11. }
    12. echo 'Всего оплатили:'.$sumoplata.'';
    13. ?>
    Поправил работает,

    Общая сумма и список номеров в заявке хранится в таблице zayavki, все попадает из формы и рассчитывается по формуле скриптом затем записывается в таблицу zayavki, а скрипт внесения оплаты получает данные по номеру заявки из таблицы zayavki.
    Я понимаю что можно было бы сделать и проще но кто знал что нужно будет такие выборки и сортировки делать, в любом бы случае передумал бы структуру базы, это у девочек "аппетит приходит во время еды" поэтому пришлось вымудровываться. Менять что то сейчас уже не имеет смысла, так как перенести все и изменить структуру еще больший гемморой.

    Simpliest все же огромное спасибо за интерес и проявленную помощь!
    :)