Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск по массиву 
:(
    Опции темы
okboss
Дата 27.6.2014, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 27.6.2014

Репутация: нет
Всего: нет



Возникла проблема с поиском нескольких чисел массива сумма которых больше либо равна 1000. Первым решением было сортировать значения массива по убыванию, затем из 1000 вычесть наибольшее значение (первый элемент массива). Есть идея сравнивать результат на равенство/больше/меньше, но как поступить дальше хороших идей нет.
Примеры массивов:
800 500 100
800 201 100 100
800 500 100 110
700 600 100 100 50 50

Это сообщение отредактировал(а) okboss - 27.6.2014, 11:39
PM MAIL   Вверх
Aliance
Дата 27.6.2014, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: нет
Всего: 137



Сама задача до конца не ясна, что конкретно нужно найти? Массивы, сумма чисел которых >= 1000? Или числа из заданного массива, которые образуют такую сумму?

И что задача делает в разделе для профи? Какова аргументация помещения ее сюда?
PM MAIL WWW ICQ Skype   Вверх
okboss
Дата 27.6.2014, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 27.6.2014

Репутация: нет
Всего: нет



Aliance
Цитата(Aliance @  27.6.2014,  12:39 Найти цитируемый пост)
Или числа из заданного массива, которые образуют такую сумму?

Второй вариант, извиняюсь за формулировку, задача намного обширней, поэтому пришлось сократить. 
На мой взгляд это не простая арифметическая задача
PM MAIL   Вверх
Aliance
Дата 27.6.2014, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: нет
Всего: 137



Если второй вариант, то какие именно нужны числа? Минимальные, сумма которых не меньше 1000? То есть если массив вида 500,300,200,100 - возвращаем все или без 100?
PM MAIL WWW ICQ Skype   Вверх
okboss
Дата 27.6.2014, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 27.6.2014

Репутация: нет
Всего: нет



Aliance, ну допустим пусть без 100
PM MAIL   Вверх
vladimrescuer
Дата 27.6.2014, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 27.6.2014

Репутация: нет
Всего: нет



Я немного подробнее опишу задачу, частный случай из которой привел okboss.

Возникла проблема с проверкой товаров в корзине на необходимость добавления еще одного бесплатного товара по акции. Акция срабатывает, когда сумма товаров в корзине >= 1000 руб. Соответственно, если товаров на 2000 р., то у нас в корзину падает 2 бесплатных товара по акции. И так далее...

Например, у нас в корзине:
Товар 1 - 500 р.
Товар 2 - 200 р.
Товар 3 - 500 р.
Товар 4 - 700 р.
Товар 5 - 500 р.
Товар 6 - 300 р.

Товары добавляются в корзину последовательно и ясно, что акция в данном случаем сработает по:
1) "Товар 1 - 500" + "Товар 2 - 200" + "Товар 3 - 500" = 1200. Т.е. 1200 > 1000. Все - товар по акции добавили в корзину. Эти три товара сыграли.
2) Дальше будет "Товар 4 - 700 р." + "Товар 5 - 500 р." = 1200, тоже 1200 > 1000. Добавляем еще один бесплатный товар по акции. Эти 2 товара отмечаем как создавшие акцию.
3) Остается один товар "Товар 6 - 300". 300 < 1000 - в итоге он не может создать акцию

В общем, вся эта схема некорректна, т.к. необходимо, чтобы акция включилась на товарах с наименьшей суммой:
1) "Товар 1 - 500" + "Товар 3 - 500" = 1000 == 100. Все, у нас уже достаточная сумма для акции.
2) "Товар 4 - 700" + "Товар 6 - 300" = 1000 - тоже достаточно для акции.
3) "Товар 2 - 200" + "Товар 5 - 500" = 700 - все, по этим товарам акция уже не включается.

Вот как организовать алгоритм такой работы в корзине с товарами. Здесь бы какую-нибудь математическую формулу. Потому что если городить условия, то их будет очень много. И не факт, что это будет работать надежно.

PM MAIL   Вверх
Aliance
Дата 27.6.2014, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: нет
Всего: 137



Акция включается в какой момент? В момент формирования заказа, когда товары уже сформированы и не меняются?
Если да, то
Цитата(vladimrescuer @  27.6.2014,  15:27 Найти цитируемый пост)
Товар 1 - 500 р.
Товар 2 - 200 р.
Товар 3 - 500 р.
Товар 4 - 700 р.
Товар 5 - 500 р.
Товар 6 - 300 р.

исходя из этих данных, какие товары должны формировать акции?
PM MAIL WWW ICQ Skype   Вверх
vladimrescuer
Дата 27.6.2014, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 27.6.2014

Репутация: нет
Всего: нет



Нам необходимо сразу показывать покупателю, что при покупке товаров на сумму >=1000 руб. включается акция. Поэтому проверка на включение акции происходит при добавлении каждого товара в корзину.

В данном примере все товары формируют акцию, если общая их стоимость >=1000. Т.е. добавили каких-то (любых) товаров в корзину и если на сумму >=1000, то ключается акция и в корзину добавляется еще один бесплатный товар (подарок). Этот товар с нулевой ценой и при дальнейшем добавлении товаров в корзину он не будет влиять на включение акции.

Разумеется, в корзине может остаться товар или несколько товаров, которые не сформируют акцию, т.к. сумма этого товара или нескольких товаров будет <1000

Это сообщение отредактировал(а) vladimrescuer - 27.6.2014, 15:06
PM MAIL   Вверх
Aliance
Дата 27.6.2014, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: нет
Всего: 137



При добавлении товаров формировать условие проще. Как я понял есть массив со ценами товаров? Значит через array_sum у нас есть и сумма цен товаров. И можно сделать условие при добавлении вида:
Код

$sum = array_sum($prices);
// если до добавления товара сумма еще не была больше или равна 1000
if ($sum < 1000) {
    $newItemPrice = 300; // стоимость товара
    if ($sum + $newItemPrice >= 1000) {
        // после добавления этого товара сумма перевалила за 1000, что-то делаем
    }
}

PM MAIL WWW ICQ Skype   Вверх
vladimrescuer
Дата 27.6.2014, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 27.6.2014

Репутация: нет
Всего: нет



Aliance, спасибо.
Но мы не можем просто последовательно складывать ценники товаров между собой. Нам нужно складывать только ценники, которые в сумме дают минимальный порог. Для нас это обязательно из-за того, что на все товары - скидка 10%, кроме тех товаров, которые формируют акцию.

В корзине:
Товар 1 - 500 р.
Товар 2 - 200 р.
Товар 3 - 500 р.
Товар 4 - 700 р.
Товар 5 - 500 р.
Товар 6 - 300 р.

Сделали акцию 1: 500+500=1000 : добавляем 1 бесплатный товар в корзину
Товар 1 - 500 р.
Товар 3 - 500 р.

А если мы сделаем так: 500+200+500 = 1200р. - И НА "ТОВАР 2" В 200 р. МЫ НЕ СМОЖЕМ ДАТЬ КЛИЕНТУ СКИДКУ, Т.К. ОН У НАС УЖЕ УЧАСТВОВАЛ В ФОРМИРОВАНИИ АКЦИИ.
Товар 1 - 500 р.
Товар 2 - 200 р.
Товар 3 - 500 р.


Потому и должны в данном примере быть сформированы акции только из товаров:
Товар 1+Товар 3
Товар 4+Товар 6
а на Товар 2 - 200 р и Товар 5 - 500 р. - МЫ ДАДИМ СКИДКУ В 10% КЛИЕНТУ. ПРИ ДРУГОМ РАСКЛАДЕ ЕМУ ДОСТАНЕТСЯ СКИДКА ТОЛЬКО НА ТОВАР 6 - 300р. Поэтому нужен первый вариант!
PM MAIL   Вверх
SergV
Дата 28.6.2014, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 197
Регистрация: 4.8.2006
Где: Германия

Репутация: нет
Всего: 1



Цитата

   Возникла проблема с проверкой товаров в корзине на необходимость добавления еще одного бесплатного товара по акции. Акция срабатывает, когда сумма товаров в корзине >= 1000 руб. Соответственно, если товаров на 2000 р., то у нас в корзину падает 2 бесплатных товара по акции. И так далее...
   
   Например, у нас в корзине:
   Товар 1 - 500 р.
   Товар 2 - 200 р.
   Товар 3 - 500 р.
   Товар 4 - 700 р.
   Товар 5 - 500 р.
   Товар 6 - 300 р.
   

А в чём собственно проблема то? Если товары по акции даются только из расчёта на сумму 1000 рублей = 1 бесплатный товар по акции, то разделив сумму товара в корзине(в данном случае 2700) на 1000, и округлив 2,7 в низ, получим 2 бесплатных товара.
А дальше дело техники, если товар в корзине лежит уже совместно с товаром из акции, то складывать нужно товары без акции, а тут нужно как то различить какие товары какие. Но можно ведь товары по акции выводить на добавление в корзину уже после того как товары будут в корзине, или вообще их держать в отдельном массиве, и потом давать клиенту отметить нужные 2 товара из его 10*-и отобранных.
Может чуть сложней будет по коду с парой отдельных массивов, но меньше геморроя с поиском каких то чисел и последующими танцами с бубном над ними... ИМХО!

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM   Вверх
wgent
Дата 29.11.2015, 08:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 6.11.2015

Репутация: нет
Всего: нет



Поскольку товаров в корзине едва ли будет 100500, можно тупо организовать перебор всех комбинаций цен:
1. Пишете функцию, последовательно считающую для некой последовательности цен количество подарков и оставшуюся сумму.
2. Организуете перебор (с рекурсией) всех порядков расположения товаров в корзине. То есть, для корзины {200, 400, 700, 800} надо просчитать функцией из п.1 следующие массивы:
{200, 400, 700, 800} 1, 800
{200, 400, 800, 700} 1, 700
{200, 700, 400, 800} 1, 800
{200, 700, 800, 400} 1, 400
{200, 800, 400, 700} 2, 0
{200, 800, 700, 400} 2, 0

{400, 200, 700, 800} 1, 800
{400, 200, 800, 700} 1, 700
{400, 700, 200, 800} 2, 0
{400, 700, 800, 200} 2, 0
{400, 800, 200, 700} 1, 900
{400, 800, 700, 200} 1, 900

{700, 400, 200, 800} 2, 0
{700, 400, 800, 200} 2, 0
{700, 200, 400, 800} 1, 800
{700, 200, 800, 400} 1, 400
{700, 800, 400, 200} 1, 600
{700, 800, 200, 400} 1, 600

{800, 400, 700, 200} 1, 900
{800, 400, 200, 700} 1, 900
{800, 700, 400, 200} 1, 600
{800, 700, 200, 400} 1, 600
{800, 200, 400, 700} 2, 0
{800, 200, 700, 400} 2, 0

(Итого, максимальное число подарков - 2, сумма неакционных твоаров - 0).
PM MAIL   Вверх
ksnk
Дата 29.11.2015, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 1
Всего: 386



vladimrescuer, На каком этапе решается помещать или не помещать в корзину бесплатный товар?
При промотре корзины товаров? Задача очевидна. Все товары уже куплены. Сравниваем суммы цен товаров без акции, получаем количество акционых товаров, отнимаем нужное количество акционных товаров и на остальные акционные товары  навешиваем полную стоимость. Если осталась возможно докупить акционный - пишем юзеру "Забери подарок..."
В карточке товаров - как дополнительная информация к кнопке "Купить"? То же самое, но к сумме неакционых прибавляем еще цену этого товара. Дальше то же самое, если появляется еще один акционный товар - пишем - "Презент..."

Ни на каком этапе не возникает задача найти пару с бОльшей или меньшей 1000 суммой.

Это сообщение отредактировал(а) ksnk - 29.11.2015, 11:47


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

Внимание: данный раздел предназначен для решения сложных, нестандартных задач.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Для профи | Следующая тема »


 




[ Время генерации скрипта: 0.1829 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.