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]   

> Без описания
jonston
Отправлено: 24 Июля, 2013 - 18:47:51
Post Id



Посетитель


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


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




Здравствуйте.Есть 2 таблицы attributes и attributes_group.Как понимаете атрибуты связаны с группами ключами отношением 1 to many (в одной группе может быть несколько атрибутов, но атрибут может относится только к одной группе).Также есть переменная $attrs в которую попадают список разных атрибутов.Значение примерно такое $attrs = '2_3_6_7', то есть атрибуты с id 2,3,6,7.нужно создать модель (функцию) которая выдает примерно такой массив
PHP:
скопировать код в буфер обмена
  1.  
  2.         array(
  3.             'group_id' => 1,
  4.             'group_name' => 'groupe1',
  5.             'group_desc' => 'groupe1 desc',
  6.             'attrs' => array(
  7.                 0 => array(
  8.                     'attr_id' => 2,
  9.                 ),
  10.                 1 => array(
  11.                     'attr_id' => 3,
  12.                 ),
  13.             ),
  14.             'group_id' => 2,
  15.             'group_name' => 'groupe2',
  16.             'group_desc' => 'groupe2 desc',
  17.             'attrs' => array(
  18.                 0 => array(
  19.                     'attr_id' => 6,
  20.                 ),
  21.                 1 => array(
  22.                     'attr_id' => 7,
  23.                 ),
  24.             ),
  25.  
  26.         );
  27.  

Нужен наиболее оптимизированный метод.Благодарю.
P.S. Аргументом должна быть строка $attrs.

(Отредактировано автором: 24 Июля, 2013 - 18:51:25)



-----
$i = 0;
$i = $i++ + ++$i; ?
 
 Top
EuGen Администратор
Отправлено: 24 Июля, 2013 - 18:56:05
Post Id


Профессионал


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


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




Использовать таблицу-связку, вместо того, чтобы склеивать id в строку.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
jonston
Отправлено: 24 Июля, 2013 - 19:00:15
Post Id



Посетитель


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


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




EuGen пишет:
Использовать таблицу-связку, вместо того, чтобы склеивать id в строку.

ID берется из массива $_GET


-----
$i = 0;
$i = $i++ + ++$i; ?
 
 Top
DeepVarvar Супермодератор
Отправлено: 24 Июля, 2013 - 19:17:37
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


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




jonston пишет:
ID берется из массива $_GET
Да хоть из ада, какая разница?
 
 Top
jonston
Отправлено: 24 Июля, 2013 - 19:26:57
Post Id



Посетитель


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


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




DeepVarvar пишет:
jonston пишет:
ID берется из массива $_GET
Да хоть из ада, какая разница?


Предлагаешь мне CMS переписать?


-----
$i = 0;
$i = $i++ + ++$i; ?
 
 Top
EuGen Администратор
Отправлено: 24 Июля, 2013 - 19:29:12
Post Id


Профессионал


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


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




Так понятнее. Речь о входных данных, а не о запросе.
Можно сделать так - сначала выбрать данные из БД, затем сформировать результирующий массив. Например (используется устаревший mysql_* - только для примера); проверку и валидацию данных опускаю:
PHP:
скопировать код в буфер обмена
  1. $rSelect = mysql_query('SELECT *, attributes_group.id AS group_key, attrributes.id AS attribute_key FROM attributes_group LEFT JOIN attributes ON attributes_group.group_id=attributes.id WHERE attributes.id IN ('.join(',', $_GET['ids']).')');
  2. $rgResult = [];
  3. while($rgRow = mysql_fetch_array($rSelect))
  4. {
  5.    $rgResult[$rgRow['group_key']]            = $rgRow;
  6.    $rgResult[$rgRow['group_key']]['attrs'][] = ['attr_id' =>$rgRow['attribute_key']];
  7. }
  8. //var_dump($rgResult);

- названия полей предположены (исходя из логики). И неймспейсинг выбран плохой - если атрибут принадлежит группе, а не наоборот, то корректнее назвать таблицу group_attributes.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
jonston
Отправлено: 24 Июля, 2013 - 19:37:47
Post Id



Посетитель


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


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




EuGen пишет:

PHP:
скопировать код в буфер обмена
  1. $rSelect = mysql_query('SELECT *, attributes_group.id AS group_key, attrributes.id AS attribute_key FROM attributes_group LEFT JOIN attributes ON attributes_group.group_id=attributes.id WHERE attributes.id IN ('.join(',', $_GET['ids']).')');
  2. $rgResult = [];
  3. while($rgRow = mysql_fetch_array($rSelect))
  4. {
  5.    $rgResult[$rgRow['group_key']]            = $rgRow;
  6.    $rgResult[$rgRow['group_key']]['attrs'][] = ['attr_id' =>$rgRow['attribute_key']];
  7. }
  8. //var_dump($rgResult);

То что доктор прописал.
Сейчас попробую и выложу свой вариант.Спасибо!)
(Добавление)
EuGen пишет:
Так понятнее.

Что будет работать быстрее
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT * FROM TABLE WHERE id = 1 OR  id = 2 OR  id = 3 OR  id = 4
  3.  

или
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT * FROM TABLE WHERE id IN (1,2,3,4)
  3.  

?
(Добавление)
Вот что получилось у меня.
PHP:
скопировать код в буфер обмена
  1.  
  2.     function getStructuresAttributeArray($children = array()){
  3.         if(empty($children) || ! is_array($children)){
  4.             return false;
  5.         }
  6.  
  7.         $sql = '';
  8.        
  9.         $sql .= "SELECT DISTINCT a_g.attribute_group_id AS group_id FROM attribute_group AS a_g
  10.        JOIN attribute AS a ON a_g.attribute_group_id = a.attribute_group_id ";
  11.        
  12.         foreach($children AS $child_key => $child_val){
  13.             $children[$child_key] = 'a.attribute_id = ' . $child_val;
  14.         }
  15.  
  16.         $sub_sql = implode(' OR ', $children);
  17.         $sql .= ' WHERE (' . $sub_sql . ')';
  18.        
  19.         $query = $this->db->query($sql);
  20.        
  21.         $attrs = array();
  22.        
  23.         if( ! empty($query->rows)){
  24.             foreach($query->rows as $row_key => $row_val){
  25.                 $sql = "SELECT * FROM attribute AS a
  26.                WHERE a.attribute_group_id = " . $row_val['group_id'] . '
  27.                AND (' . $sub_sql . ')';
  28.                
  29.                 $query = $this->db->query($sql);
  30.  
  31.                 foreach($query->rows AS $key => $val){
  32.                     $attrs[$row_key][] = $val['attribute_id'];
  33.                 }
  34.             }            
  35.         }
  36.        
  37.         return $attrs;
  38.     }
  39.  


-----
$i = 0;
$i = $i++ + ++$i; ?
 
 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