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]   

> Без описания
madlabel
Отправлено: 18 Сентября, 2015 - 11:45:53
Post Id


Новичок


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


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




Есть 2 массива

1. Значения свойств из бд
Array ( [0] => Array ( [id] => 2 ) [1] => Array ( [id] => 1 ) )

2. Значения всех свойств из бд
Array ( [0] => Array ( [id] => 11 ) [1] => Array ( [id] => 2 ) [2] => Array ( [id] => 1 ) [3] => Array ( [id] => 9 ) [4] => Array ( [id] => 10 ) )

Нужно их как-то сравнить, имеются ли значения 1го во 2м.
Пробовал in_array & array_search.
 
 Top
Panoptik
Отправлено: 18 Сентября, 2015 - 12:05:31
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


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




array_intersect, array_diff

только учтите что функции работают с одномерными массивами. так что как вы будете их преобразовывать на ваших плечах


-----
Just do it
 
 Top
madlabel
Отправлено: 18 Сентября, 2015 - 14:22:38
Post Id


Новичок


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


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




Panoptik пишет:
array_intersect, array_diff

только учтите что функции работают с одномерными массивами. так что как вы будете их преобразовывать на ваших плечах


И как же все таки их преобразовать в одномерный?
 
 Top
Sail
Отправлено: 18 Сентября, 2015 - 14:45:16
Post Id



Участник


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


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




madlabel, вот два простых варианта:
PHP:
скопировать код в буфер обмена
  1. $arr1 = array(array('id' => 7), array('id' => 3));
  2. $arr2 = array(array('id' => 1),array('id' => 2),array('id' => 3),array('id' => 4),array('id' => 5));
  3.  
  4. $arr = array();
  5. foreach($arr1 as $value) {
  6.     if(in_array($value, $arr2)) {
  7.         $arr[] = $value;
  8.     }
  9. }
  10. var_dump($arr);
  11.  
  12. $arr = array_uintersect($arr1, $arr2, function($a, $b){return $a['id'] - $b['id'];});
  13.  
  14. var_dump($arr);

(Добавление)
PS: проверки, не преобразования... для преобразования можно array_map() использовать.
 
 Top
madlabel
Отправлено: 20 Сентября, 2015 - 01:00:40
Post Id


Новичок


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


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




PHP:
скопировать код в буфер обмена
  1.  
  2. $categories = SELECT id, description FROM table1;
  3. $checkeds = SELECT id FROM table2;
  4. $diff = array_intersect($checkeds, $categories);
  5. foreach($categories AS $row){
  6. if(in_array(array('id' => $row['id']), $diff)){
  7. $all_properties .= '<input type="checkbox" name="properties[]" value="'.$row['id'].'" checked>';
  8. } else {
  9. $all_properties .= '<input type="checkbox" name="properties[]" value="'.$row['id'].'">';
  10. }


in_array(array('id' => $row['id']), $diff) - я так понимаю это сопли, как их убрать так и не понял, но - работает! Может у кого есть идеи? Или я что-то не доглядел.

(Отредактировано автором: 20 Сентября, 2015 - 01:01:43)

 
 Top
madlabel
Отправлено: 21 Сентября, 2015 - 12:14:01
Post Id


Новичок


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


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




Мыслей нет ни у кого? Хм
 
 Top
DlTA
Отправлено: 21 Сентября, 2015 - 14:36:10
Post Id



Постоянный участник


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


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




madlabel пишет:
in_array(array('id' => $row['id']), $diff) - я так понимаю это сопли, как их убрать
убрать с какой целью?
 
 Top
Мелкий Супермодератор
Отправлено: 21 Сентября, 2015 - 14:45:25
Post Id



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


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


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




CODE (SQL):
скопировать код в буфер обмена
  1. SELECT a.id, a.description, s.id IS NOT NULL AS is_selected
  2. FROM table_all_options AS a
  3. LEFT JOIN table_selected_options s ON a.id = s.id

PHP:
скопировать код в буфер обмена
  1. foreach (/**/) {
  2. if ($row['is_selected']) {
  3. // такой пункт выбран
  4. } else {
  5. // такой пункт не выбран
  6. }
  7. }


-----
PostgreSQL DBA
 
 Top
madlabel
Отправлено: 30 Сентября, 2015 - 05:51:54
Post Id


Новичок


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


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




Мелкий пишет:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT a.id, a.description, s.id IS NOT NULL AS is_selected
  2. FROM table_all_options AS a
  3. LEFT JOIN table_selected_options s ON a.id = s.id

PHP:
скопировать код в буфер обмена
  1. foreach (/**/) {
  2. if ($row['is_selected']) {
  3. // такой пункт выбран
  4. } else {
  5. // такой пункт не выбран
  6. }
  7. }


А как вывести отмеченные для определённой категории?
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. foreach(/**/){
  3. if($row[’is_selected'] && ($row['category_id'] == $_GET['id'])){
  4. // пункт выбран
  5. } else {
  6. // пункт не выбран
  7. }
  8. }
  9.  

Или можно запросом это сделать?
 
 Top
Мелкий Супермодератор
Отправлено: 30 Сентября, 2015 - 10:37:42
Post Id



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


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


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




Конечно можно и нужно запросом. Банальное условие в where


-----
PostgreSQL DBA
 
 Top
madlabel
Отправлено: 04 Октября, 2015 - 06:03:06
Post Id


Новичок


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


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




Мелкий пишет:
Конечно можно и нужно запросом. Банальное условие в where


WHERE не подходит.
Суть вот в чем:

Категории:
Таблица: _categories : |id|description|

Атрибуты:
Таблица: _properties: |id|description|

Связь категории и атрибута:
Таблица:_categories_properties: |id|category_id|property_id|

Мне нужно вывести флажки всех атрибутов для категории id которой равен $_GET['id'] при этом отметить (checked) те, которые находятся в таблице связке.

Делаю так:
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT  `c`.`category_id`,
  3.              `p`.`id`,
  4.              `p`.`description`,
  5.              `c`.`property_id` IS NOT NULL AS is_checked
  6.         FROM `".PREFIX."_properties` AS p
  7.         LEFT JOIN `".PREFIX."_categories_properties` AS c ON `c`.`property_id` = `p`.`id`                        
  8.               ORDER BY `p`.`position` DESC
  9.  


Далее разбираю:
CODE (htmlphp):
скопировать код в буфер обмена
  1. foreach($rows AS $row){
  2. if(($row['is_checked']) && $row['category_id'] == $_GET['id']){
  3. // Отмечаю флажок
  4. }
  5. }
  6.  


На выходе почему-то получаю повторяющиеся значения атрибутов. DISTINCT и GROUP by не помогают, как быть? Может я что-то не так делаю..
 
 Top
Мелкий Супермодератор
Отправлено: 04 Октября, 2015 - 09:52:59
Post Id



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


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


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




madlabel пишет:
Мне нужно вывести флажки всех атрибутов для категории id которой равен $_GET['id'] при этом отметить (checked) те, которые находятся в таблице связке.

Вывести всё из properties, при этом пометить те строки, для которых в categories_properties есть связь с определённой категорией.
Верно?

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT  `c`.`category_id`,
  2.              `p`.`id`,
  3.              `p`.`description`,
  4.              `c`.`property_id` IS NOT NULL AS is_checked
  5.         FROM `".PREFIX."_properties` AS p
  6.         LEFT JOIN `".PREFIX."_categories_properties` AS c ON `c`.`property_id` = `p`.`id` AND c.category_id = ?
  7.               ORDER BY `p`.`position` DESC


madlabel пишет:
Таблица:_categories_properties: |id|category_id|property_id|

Нафига поле id? Оно лишнее, category_id и property_id более чем достаточно и являются хорошим первичным ключом. Плюс индекс по property_id для обратного поиска.


-----
PostgreSQL DBA
 
 Top
madlabel
Отправлено: 05 Октября, 2015 - 18:21:01
Post Id


Новичок


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


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




Мелкий пишет:
madlabel пишет:
Мне нужно вывести флажки всех атрибутов для категории id которой равен $_GET['id'] при этом отметить (checked) те, которые находятся в таблице связке.

Вывести всё из properties, при этом пометить те строки, для которых в categories_properties есть связь с определённой категорией.
Верно?

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT  `c`.`category_id`,
  2.              `p`.`id`,
  3.              `p`.`description`,
  4.              `c`.`property_id` IS NOT NULL AS is_checked
  5.         FROM `".PREFIX."_properties` AS p
  6.         LEFT JOIN `".PREFIX."_categories_properties` AS c ON `c`.`property_id` = `p`.`id` AND c.category_id = ?
  7.               ORDER BY `p`.`position` DESC


madlabel пишет:
Таблица:_categories_properties: |id|category_id|property_id|

Нафига поле id? Оно лишнее, category_id и property_id более чем достаточно и являются хорошим первичным ключом. Плюс индекс по property_id для обратного поиска.


Все верно, спасибо!!! Радость
 
 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