Как из массива получить данные по критериям?

AS0ft

Новичок
Как из массива получить данные по критериям?

Условие такое: Нужно получить только, те id_tovara, у которых значения val=2,16,20
т.е. в данном случае получить $tovar=208,209

PHP:
Array (10)
0 => stdClass Object (2)
  id_tovara => 212
  val => 2
1 => stdClass Object (2)
  id_tovara => 211
  val => 20
2 => stdClass Object (2)
  id_tovara => 211
  val => 16
3 => stdClass Object (2)
  id_tovara => 208
  val => 20
4 => stdClass Object (2)
  id_tovara => 208
  val => 16
5 => stdClass Object (2)
  id_tovara => 208
  val => 2
6 => stdClass Object (2)
  id_tovara => 212
  val => 16
7 => stdClass Object (2)
  id_tovara => 209
  val => 20
8 => stdClass Object (2)
  id_tovara => 209
  val => 16
9 => stdClass Object (2)
  id_tovara => 209
  val => 2
 

Observer

Новичок
Если вопрос про массивы PHP, то почему постите в форум по БД?
И вообще, в чем проблема? Вы пытались сами хотя бы что-то написать?
 

AS0ft

Новичок
Автор оригинала: Observer
Если вопрос про массивы PHP, то почему постите в форум по БД?
И вообще, в чем проблема? Вы пытались сами хотя бы что-то написать?
Сорри, что сдесь тему создал.
А проблема и заключается в том, что как получить только, те id_tovara, у которых значения val=2,16,20
 

Observer

Новичок
http://phpclub.ru/talk/showthread.php?s=&threadid=90889

Такие операции лучше делать на уровне БД, как это сделать, уже подсказал bkonst. Чем не устраивает такой способ?
 

Observer

Новичок
Автор оригинала: AS0ft
Такой способ не устраивает, т.к. значения val могут быть не только равными 2, но и 10?
Выражайтесь яснее... 10 - количество возможных значений или само значение?
 

Wicked

Новичок
Если можно сделать на уровне бд, то я бы сделал это таким запросом:
[sql]select `id_tovara`, count(dinstinct(`val`)) as `C` ... where `val` in (2, 16, 20) group by `id_tovara` having `C` = 3;[/sql]

Если на уровне бд нельзя, то переделай массив в вид
array(209 => array(2, 16, 20), 211 => array(16, 20)), а дальше count(array_instersect())
 

AS0ft

Новичок
Автор оригинала: Wicked

Если на уровне бд нельзя, то переделай массив в вид
array(209 => array(2, 16, 20), 211 => array(16, 20)), а дальше count(array_instersect())
Так array_instersect вычисляет схождение массивов, а у меня то он только один!
 

Wicked

Новичок
У тебя должен быть массив чисел val = array(2, 16, 20) и массив массивов чисел. Вот и сравнивай в цикле (foreach) одномерные под-массивы с массивом val.
 

AS0ft

Новичок
Кстати, возможно такое!
Зная что выборка имеет 3 значения, то
проверить сколько раз присутствует в массиве id_tovara = 211,212,208,209
т.е. если 208 и 209 присутствуют 3 раза, то этот списочек закинуть в переменную.
Возможно ли так сделать?
 

Wicked

Новичок
Вопрос состоит не в подсчете количества товаров
если это относится к запросу, то поправил - добавил там id. В любом слчае, про количество товаров речи я нигде не вел.
 

Wicked

Новичок
AS0ft
А если у них будут val = 96, val = 97, val = 98 ? В этом случае же не должно быть совпадения.

Тебе что ли не понятны варианты, которые я тебе дал, что ты придумываешь какие-то новые?
 

AS0ft

Новичок
Автор оригинала: Wicked
AS0ft
А если у них будут val = 96, val = 97, val = 98 ? В этом случае же не должно быть совпадения.

Тебе что ли не понятны варианты, которые я тебе дал, что ты придумываешь какие-то новые?
А ну да, логично.
Тогда возвращяюсь к твоему варианту. Сорри за такие вопросы. Возможны ли они сдесь.
А можно по запросу к бд поконкретнее написать.
еще раз извините.

-~{}~ 19.09.06 12:57:

вот оригинал запроса

PHP:
                $sql32 = $db->Query("SELECT
                               	id_tovara,
				val		
                FROM
			       
                               shop_fields_value
		WHERE		
				(articlecat = '".escs($_REQUEST['categ'])."' || articlecat_2 = '".escs($_REQUEST['categ'])."') AND 
				articlecat_2 != '0' AND
				val IN (".$idd.") AND active='1'
				ORDER BY `id_tovara` ASC
                               ");
 

Observer

Новичок
так, а где тут сами поля? :)
или это все равно, в КАКИХ полях находятся искомые значения?
 

Wicked

Новичок
я же написал выше, как примерно должен выглядеть запрос. Тебе там осталось только сделать подстановку реальных величин + указать FROM shop_fields_value и добавить WHERE условия (для полей articlecat, articlecat_2, active).

-~{}~ 19.09.06 16:14:

Observer
на самом деле ты зря свой комент удалил. Я почитал что обсуждается в том трэде, и мне показалось, что тут мы вообще не о том, о чем надо беседуем :)
 

AS0ft

Новичок
Автор оригинала: Wicked
я же написал выше, как примерно должен выглядеть запрос. Тебе там осталось только сделать подстановку реальных величин + указать FROM shop_fields_value и добавить WHERE условия (для полей articlecat, articlecat_2, active).
Да подставил, только я в таких запросах не силен, точнее первый раз такое вижу, ошибку выдает.

PHP:
$sql32 = $db->Query("SELECT id_tovara,
count(dinstinct('val')) as 'c' 

  FROM shop_fields_value,

  WHERE		

(articlecat = '".escs($_REQUEST['categ'])."' || articlecat_2 = '".escs($_REQUEST['categ'])."') AND 
articlecat_2 != '0' AND
val IN (".$idd.") AND active='1'
GROUP BY 'id_tovara' 
HAVING 'c' = 3
                               ");
-~{}~ 19.09.06 13:23:

ошибку в запросе я исправил, а вот на выходе ничего не получил!
 

Observer

Новичок
Короче, генерируем запрос так!

PHP:
// поля по которым производится поиск
// (id поля => значение поля)
// количество полей может быть любым!
$fields = array(
    29 => 14,
    31 => 2,
    32 => 16,
    33 => 20
);

$q_tables = '';
$q_where = '';
$i = 1;
foreach ($fields as $field_id => $val_id) {
    $q_tables .= ($q_tables != '' ? " LEFT JOIN " : '')
                    . "shop_fields_value as s" . $i
                    . ($q_tables != '' ? " ON s" . ($i-1) . ".id_tovara = s$i.id_tovara " : '');
    $q_where  .= ($q_where != '' ? " AND " : '')
                    . "(s$i.idfield = $field_id AND s$i.val = $val_id)"
                    . ($q_where != '' ? " " : '');
    $i++;
}
$query = "SELECT s1.id_tovara FROM $q_tables WHERE ($q_where)";
Остальное добавляйте сами!
... и попробуйте сказать, что это вам не подходит :)
 
Сверху