powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Помогите с построением массива (sql,php,smarty)
4 сообщений из 4, страница 1 из 1
Помогите с построением массива (sql,php,smarty)
    #38581577
cossack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
День добрый! Вот застрял сегодня, буду рад если поможете!

Начну с бд:

Таблица: product

id, name, shop_product_id, brand_id, category_id, subcategory_id, unit_value ....

Таблица: shop_product

id name

//поясню: есть продукты с одинаковыми названиями, но разными размерами:
product:
id, name, shop_product_id
11, c4 (10l), 1
12, c4 (12l), 1

В таблице shop_product
id, name
1 c4

Если в таблице shop_product имеется запись, то берем ее.
Вот сам запрос:
Код: plsql
1.
2.
3.
4.
5.
6.
SELECT p.`id`, b.`name` as brand_name, if(p.shop_product_id>0,sp.name,p.name) as name, p.shop_product_id, p.`unit_value`,  p.`unit`, p.`category_id`, p.`subcategory_id` 
FROM `product` p 
left join shop_product sp on p.shop_product_id=sp.id 
left join brand b on p.brand_id=b.id 
where  p.`brand_id` in (51)  
order by brand_name,name,p.unit_value 



id brand_name nameshop_product_idunit_valueunitcategory_idubcategory_id1933 CELL A Performance 1095 339 grams 13 01521 CELL C4 914 180 grams 8 01522 CELL C4 914 360 grams 8 03923 CELL CLK (90) 0 90 capsules 20 02637 CELL Cor Performance (2lbs) 0 908 grams 1 1152638 CELL Cor Performance Whey (4lbs) 0 1800 grams 1 1151931 CELL Creatine Cor 1094 410 grams 4 45

Обрабатываю в php и отправляю в smarty.

В html с помощью smarty нужно отобразить все уникальные по имени продукты, а с продуктами которые повторяються засунуть <select>
Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<ul>
{foreach array as item}
<li>{product.name}... 
<select>
  <option>-</option>
  {foreach item ...}
  <option>{unit_value}</option>
  {/foreach}
</select>
</li>
{/foreach}
</ul>



Ну вот как то так.
Зарание благодарен!
...
Рейтинг: 0 / 0
Помогите с построением массива (sql,php,smarty)
    #38581677
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cossack,

Рад бы помочь. Да вот метод решения задачи не помог понять саму задачу. Поясни пожалуйста, что в каждой таблице лежит (то есть что за данные в shop_product и в product, и в чём их смысловое отличие). А потом ещё что требуется в итоге получить (например, получить выборку всех продуктов, которые купили на сайте...). Тогда с удовольствием помозгую над задачей ;)
...
Рейтинг: 0 / 0
Помогите с построением массива (sql,php,smarty)
    #38581699
cossack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Програмёр,

В таблице product лежит вся инфо о продукте.
id,name, shop_product_id, category_id_subcategory_id, price_brutto, price_netto, image, unit ....
Есть таблица shop_product. В ней обрезанное имя продукта, если такова имеется.
К примеру продукты с именем; с4 (10литров),с4 (15 литров) ---разные продукты с разными id и ценами. У них, если есть shop_product_id, будет в таблице shop_product такой вариант имени: c4

product:
idnameshop_product_idunit_valueunit1с4 (10литров)2180грамм2с4 (15 литров)2360грамм

shop_product:
idname2с4

У каждого продукта есть своя марка (brand_id),категория (category_id), возможно и подкатегория (subcategory_id)
Есть еще и таблица со вкусами продукта (я ее не описывал) flavour;
idnameproduct_idstock1banan1232ananas1155

В итоге нужно вывести:
список продуктов (к примеру марки с номером 51) с image и ценой. Если есть одинаковый shop_product_id выводим один, а остальные в <select> в виде unit_value,unit; если есть разные вкусы к непоредственно данному продукту, то предлагаем выбрать их также с помощью <select>
После sql запроса(смотри выше) мы видем, что продукты с id 1521,1522 имеют одинаковый shop_product_id => мы вывод один из них, к примеру первый продукт (180 грамм), но при этом предлагаем на выбор и 360 грамм:
Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CELL C4
<select>
<option selected="seelected">180 грамм</option>
<option >360 грамм</option>
</select>
<select>
<option>-</option>
<option >banan</option>
<option >ananas</option>
</select>



Я в php обрабатываю так:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
$array = array();
while($e = mysql_fetch_assoc($query)){
if($e['shop_product_id']!=0){
$array['shop_product_id'] = $e;
$array['shop_product_id'] ['products'] [$e['id']]= $e;
}else{
$array['id'] = $e;
$array['id'] ['products'] [$e['id']]= $e;
}
}



в html
Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<ul>
{foreach $array as $item}
<li>
{item.brand_name} {item.name} {item.price}
<select>
{foreach $item.product as $v}
<option>{$v.unit_value}</option>
{/foreach}<select>
</li>
{/foreach}
</ul>



вариант с перезаписыванием меня не устраевает.
Если будут еще вопросы, постораюсь подробно ответить
...
Рейтинг: 0 / 0
Помогите с построением массива (sql,php,smarty)
    #38581871
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cossack,

В идеале, это не товар с категориями и подкатегориями... А товар с котегориями, под-категориями и группами. Группы - ну это под-под-категории :). Всё кроме непосредственно товаров хранится в одной таблице, а товары - в другой (это идеально в моём видении, но возможно есть что-то чего я не знаю или не учёл)

Учитывая, что система уже как я понимаю построена, рассмотрим "не идеальные" варианты:
то есть у нас есть таблица групп (shop_product) и таблица товаров (product). Нам надо вывести товары по группам, при чём не каждый из товаров принадлежит к некой группе.

Запрос будет выглядеть так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT p.`id`, b.`name` as `brand_name`, sp.`name` as `group_name`, 
p.`name` as `name`, p.`shop_product_id` as `group_id`, p.`unit_value`,  p.`unit`, p.`category_id`, p.`subcategory_id` 
FROM `product` p 
left join shop_product sp on p.shop_product_id=sp.id 
left join brand b on p.brand_id=b.id 
where  p.`brand_id` in (51)  
order by brand_name,name,p.unit_value 



Как я понял по задумке, продукты одной группы (из shop_product) не могут принадлежать к нескольким брэндам... А потому, мы имеем чёткую сортировку продуктов по их группам... теперь соберём из этого массив:
Код: php
1.
2.
3.
4.
5.
6.
$array = array();
$num = 0;
while($e = mysql_fetch_assoc($query)){
  if($num==0 || $e['group_id']==0 || $array[$num-1]['group_id']!=$e['group_id']){$array[$num]=array($e); $num++;}
  else{$array[$num][]=$e;}
}



Если нигде не ошибся, на выходе получим массив, разделённый по группам товаров. Вот теперь в смарти проверяем, если в массиве больше одного элемента - толкаем его в селект... если 1 - то просто показываем (он уникальный в пределах своей группы). имя группы и имя товара есть для каждого из них, потому так же по условию смотрим что нам надо вывести и выводим...

P.S. только вот как оригинальный вариант должен был решать задачу я не понял. Во-первых, нету блока в смарти для вывода уникальных товаров (ну это ладно.. будем считать что это альфа версия скрипта :) ). Во-вторых, то, что в скрипте названо array (массив), реально таковым не является, так как всегда содержит в себе данные о последнем товаре!!! И ТОЛЬКО О НЁМ!

В общем идею подал. Если что-то будет не понятно - пиши... всегда рад помочь ;)
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Помогите с построением массива (sql,php,smarty)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]