Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Maykel-ctba

[Resolvido] Como montar esta string com arrays sempre dinâmicos

Recommended Posts

Fala galera!

 

Estou desenvolvendo um sistema de produtos, e caí em um probleminha aqui. Graças a ajuda do pessoal do MYSQL aqui do fórum, consegui realizar manualmente as pesquisas que eu gostaria, mas na hora de jogar para o PHP para automatizar esta consulta, estou me embananando um pouquinho.

 

Tenho o seguinte array ($_POST['cbFiltro']):

 

[0] => 1-1

[1] => 1-19

[2] => 2-8

 

explicando, a pessoa dá um submit em um formulario selecionando os campos que deseja buscar, e gera este post. Cada indice é composto por 2 numeros separados por um hifen. O primeiro numero é a categoria em que o produto está e o segundo é a subcategoria.

 

Eu preciso gerar uma consulta SQL exatamente como esta:

 

SELECT spf.proId FROM sistema_produto_filtro spf, sistema_filtro sf where spf.filId = sf.filId group by spf.proId
HAVING 
    (group_concat(\'X\',sf.catFiltroId,\'-\',sf.filId,\'X\') like \'%X1-19X%\' OR group_concat(\'X\',sf.catFiltroId,\'-\',sf.filId,\'X\') like \'%X1-1X%\')
AND
    (group_concat(\'X\',sf.catFiltroId,\'-\',sf.filId,\'X\') like \'%X2-8X%\')

 

Podem ver que os números da primeira linha do HAVING são os 2 primeiros indices do array, e o AND contempla a terceira linha da consulta.

 

Simplificando, preciso agrupar todos os itens iguais que tenham o primeiro numero do array (se tiver 1-1, 1-2, 1-3, preciso montar a primeira linha do HAVING) e para o AND, as diferentes (2-1, 3-1), compreenderam?

 

O intuito disso é que para cada array que tem o primeiro numero igual, devo fazer um OR, e para os que são diferentes, AND.

 

Tentei da seguinte maneira:

 

	// * Pegar IDs das categorias e filtros concatenados
$arrayCatFiltroFiltro = $_POST['cbFiltro'];

for($i = 0; $i < count($_POST['cbFiltro']); $i++){

	$explodeCatFiltroFiltro = explode("-",$_POST['cbFiltro'][$i]);
	$categoriaFiltroAtual = $explodeCatFiltroFiltro[0];
	$filtroAtual = $explodeCatFiltroFiltro[1];

	$condicao .= (empty($condicao)) ? "group_concat(\'X\',sf.catFiltroId,\'-\',sf.filId,\'X\') like \'%X".$categoriaFiltroAtual."-".$filtroAtual."X%\'" : " OR group_concat(\'X\',sf.catFiltroId,\'-\',sf.filId,\'X\') like \'%X".$categoriaFiltroAtual."-".$filtroAtual."X%\'";	

}

echo($condicao);

 

Porém, desta maneira ele está agrupando tudo em uma linha só, eu nao sei como fazer para que todos os que tenham por exemplo, o $categoriaFiltroAtual = 1 fiquem juntos, e quando o valor for diferente de 1, vá para uma outra linha, pode até ser outra variavel.

 

Acredito que se existisse algum jeito de manipular arrays duplas... talvez resolvesse o problema, mas nao faço nem ideia da logica para isso, quem dera para transformar a lógica em prática, hehe!

Compartilhar este post


Link para o post
Compartilhar em outros sites

-----------------

Resolvido galera!

 

						if(!empty($_POST['cbFiltro']))
						{
							$arrayCatFiltroFiltro = $_POST['cbFiltro'];

							$categoriaVerificacao = "";

							for($i = 0; $i < count($_POST['cbFiltro']); $i++)
							{	
								$explodeCatFiltroFiltro = explode("-",$_POST['cbFiltro'][$i]); // Divide o array em Categoria e filtro

								// * Verifica se é o primeiro filtro a ser exibido.
								// * Isso para gerar a primeira consulta
								if(empty($categoriaVerificacao))
								{
									$condicaoCategoria .= "proId in (SELECT spf.proId FROM sistema_produto_filtro spf, sistema_filtro sf WHERE spf.filId = sf.filId GROUP BY spf.proId HAVING (";
									$condicaoCategoria .= "group_concat('X',sf.catFiltroId,'-',sf.filId,'X') LIKE '%X".$explodeCatFiltroFiltro[0]."-".$explodeCatFiltroFiltro[1]."X%'";
									$categoriaVerificacao = $explodeCatFiltroFiltro[0];
								}

								// * Se não for a primeira
								else
								{
									// * Verifica se pertence a mesma categoria, para agrupar os filtros dentre a mesma categoria
									// * Se for da mesma categoria, agrupa com OR
									if($categoriaVerificacao == $explodeCatFiltroFiltro[0])
									{
										$condicaoCategoria .= " OR ";
										$condicaoCategoria .= "group_concat('X',sf.catFiltroId,'-',sf.filId,'X') LIKE '%X".$explodeCatFiltroFiltro[0]."-".$explodeCatFiltroFiltro[1]."X%'";
									}

									// * se for de uma categoria diferente, separa por AND
									else
									{
										$condicaoCategoria .= ")";
										$condicaoCategoria .= " AND (";
										$condicaoCategoria .= "group_concat('X',sf.catFiltroId,'-',sf.filId,'X') LIKE '%X".$explodeCatFiltroFiltro[0]."-".$explodeCatFiltroFiltro[1]."X%'";
									}
								}
							}
							$condicaoCategoria .= "))";
						}
						else
						{
							$condicaoCategoria = "";	
						}

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.