Ir para conteúdo

POWERED BY:

Arquivado

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

Mário Miranda

[Resolvido] foreach dentro do for

Recommended Posts

Pessoal boa tarde.

gostaria de saber se tem como eu redefinir o valor de uma chave de um array.

Por exemplo,quando a chave for igual a 0, eu coloco ela com valor 1.

Obrigado desde já.

 

OBS: Me desculpem pelo titulo, eu ia escrever uma coisa mas havia notado o erro antes de escrever, mas acabei esquecendo de mudar o titulo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa. Valeu pela dica Beraldo.

Isso funciona mesmo. Mas vou analisar pra ver se é a melhor coisa a fazer, levando em conta sua dica sobre sobreescrever.

 

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então.

É que na verdade é assim:

Eu tenho um for e dentro dele eu tenho um foreach.

O Erro é na lógica.

eu estou saindo do serviço agora e a coisa é meio grande.

Assim que chegar amanhã eu posto aqui pra pedir uma ajuda pra uma melhor solução .

(só não faço em casa porque não tenho net lá http://forum.imasters.com.br/public/style_emoticons/default/natal_sad.gif )

 

Agradeço a atenção Beraldo.

Amanhã mesmo eu posto.

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia Pessoal.

Seguindo as orientações do Beraldo, vou postar o meu problema seguido dos códigos. É um pouco grande. Vou tentar resumir o máximo.

Primeiro vou descrever o problema.

Eu tenho uma função chamada report e ela recebe como parâmetro um nome de uma tabela qualquer.

Vejam:

private function report($table){
		$_referenceMap;
		//Onde $table é a tabela passada como parâmetro
		//esta tabela é a que faz  a requisição de relacionamento
			switch($table){
				case 'tb_fornecedor':
				$_referenceMap    = array(        
				'tb_financeiro_contas' => array(
				 'colunas'=> array('valor_total|num' =>"Valor da última duplicata","valor_pago|num" =>"Campo de teste"),
				 'TabelaRef'
56b
;=> 'tb_financeiro_contas',
				 'ColunaRef'=> array('id_fornecedor'),'titulo'=>'Financeiro'),
				 'tb_fornecedor' => array(
				 'colunas'=> array('id_fornecedor|int' =>"Cod. Fornecedor",
									"razao_fornecedor|char" =>"Razão Social",
									"cnpj_fornecedor|char"=>"CNPJ",
									"ie_fornecedor|char"=>"Inscrição Estadual",
									"tel1_fornecedor|char"=>"Telefone 01",
									"tel2_fornecedor|char"=>"Telefone 02"),
				 'TabelaRef'=> 'tb_fornecedor',
				 'ColunaRef'=> array('id_fornecedor'),'titulo'=>'Fornecedor'),
				 'tb_nota_fiscal' => array(
				 'colunas'=> array('total_nf|num' =>"Valor da última Nota"),
				 'TabelaRef'=> 'tb_nota_fiscal',
				 'ColunaRef'=> array('id_fornecedor'),'titulo'=>'Nota Fiscal'));
				break;
			
			}
			return $_referenceMap;
		}

Depois vou ter uma função chamada constructQueryReport que recebe dois parâmetros: um nome de uma tabela e colunas as quais eu quero que a função monte a query.

Consiste em enviar uma tabela, campos que o usuário selecion

56b

e e a partir dessa infomação, a função monta a query com seus inner join necessários.

Segue a função:

public function constructQueryReport($tableEnv,$columnEnv){
		
			//$columnEnv=asort($columnEnv);
			$tableEnv=substr($tableEnv,0,strlen($tableEnv)-1);
			$tabelas= $this->report($tableEnv);
			$colunaRelacionada= $columnEnv;
			//$colunaRelacionada=explode("|",$colunaRelacionada);
			$tabela=array();
			$coluna=array();
			$b=0;
			$d=0;
			//print_r($columnEnv);
			ksort($colunaRelacionada);
			//print_r($colunaRelacionada);	
		
			foreach($colunaRelacionada as $a){
				$tabelaEnviada=explode(".",$a);
				
				if($_SESSION['tabelaEnv'] != $tabelaEnviada[0]){
				$_SESSION['tabelaEnv'] = $tabelaEnviada[0];
				
				$tabela[$b]=$tabelaEnviada[0];
				
				$b++;
				}
				
				$coluna[$d]=$tabelaEnviada[1];
				
				$d++;
			}
			$c=0;
			$dinamicQuery="select ";
			$dinamicQuery1="select ";
			$leftJoin="";
			$leftJoin1="";
			$i=0;
			//este for é o que contém o foreach que eu estou tendo problemas
			for($c;$c < $d; $c++){
			//echo $t
56b
abela[$c]."<br>";
			$table = $tabelas[$tabela[$c]];
				$colunas = $table[ 'colunas' ];
				$tabelaRef = $table[ 'TabelaRef' ];
				$colunaRef = $table[ 'ColunaRef' ];
				
				if($colunas){
					$colunas = array_keys($colunas);
					
					                             //este é o foreach
					foreach($colunas as $a){
					
					
						$colunaArray=explode("|",$a);
							//echo "".$colunaArray[0]." == ".$coluna[$i]."<br>";
						if($coluna[$i]){
							if(strstr($coluna[$i],'as')){
							$colunaSepara=explode('as',$coluna[$i]);
							
							$dinamicQuery1.= $tabela[$c].'.'.utf8_decode($colunaSepara[0]).',';
							$dinamicQuery.= $tabela[$c].'.'.utf8_decode($coluna[$i]).',';
							}else{
							$dinamicQuery.= $tabela[$c].'.'.utf8_decode($coluna[$i]).',';
							$dinamicQuery1.= $tabela[$c].'.'.utf8_decode($coluna[$i]).',';
							}
						}
					
					$i++;
					break;
					}
				}
				if($colunaRef){
					foreach($colunaRef as $a){
						if($
56b
tabelaRef != 'tb_fornecedor'){
						$leftJoin.= " inner join $tabelaRef on tb_fornecedor.$a = $tabelaRef.$a ";
						$leftJoin1.= " inner join $tabelaRef on tb_fornecedor.$a = $tabelaRef.$a ";
						}
					}
				}
				
			}
			$queryEnviada=array(substr($dinamicQuery,0,strlen($dinamicQuery)-1)." from tb_fornecedor ".$leftJoin,substr($dinamicQuery1,0,strlen($dinamicQuery1)-1)." from tb_fornecedor ".$leftJoin1);
			//return substr($dinamicQuery,0,strlen($dinamicQuery)-1)." from tb_fornecedor ".$leftJoin;
			
			return $queryEnviada;
		
		}
Agora vou mostrar o exemplo de parâmetro que eu envio:

$tabela='tb_fornecedor';
O segundo parâmetro é um array, que eu envio via url. Envio de uma maneira meio "feia" pois eu não sei que outra maneira eu posso enviar.

//o formato da URL é
teste.php?nome_relatorio=&tipo_papel=P&tabela_relacionada=tb_nota_fiscal|&colunaRelacionada[1]=tb_nota_fiscal.total_nf%20as%20%22VALOR DA ULTIMA NOTA%22&colunaRelacionada[2]=tb_fornecedor.id_fornecedor%20as%20%22COD FORNECEDOR%22&colunaRelacionada[3]=tb_fornecedor.razao_fornecedor%20as%20%22RAZAO SOCIAL%22&colunaRelacionada[4]=tb_fornecedor.cnpj_fornecedor%
56b
20as%20%22CNPJ%22

Pego via $_REQUEST o parâmetro colunaSelecionada.

Dentro dos colchetes do parâmetro vão números que servem para definir a ordem a qual

os campo serão montados na query.

Isso tudo para que o usuário possa criar um relatório e possa definir em que coluna do relatório ele quer em cada campo.

A URL passada acima resulta nessa saida de array quando usado dentro do foreach (que está dentro do for).

Array ( [0] => total_nf|num ) 
Array ( [0] => id_fornecedor|int [1] => razao_fornecedor|char [2] => cnpj_fornecedor|char [3] => ie_fornecedor|char [4] => tel1_fornecedor|char [5] => tel2_fornecedor|char ) select tb_nota_fiscal.total_nf as "VALOR DA ULTIMA NOTA",tb_fornecedor.id_fornecedor as "COD FORNECEDOR" from tb_fornecedor inner join tb_nota_fiscal on tb_fornecedor.id_fornecedor = tb_nota_fiscal.id_fornecedor
Mostram duas arrays pois nesse exemplo eu estou tentando gerar uma query de 2 tabelas. A tb_nota_fiscal, que tem como campos total_nf; e a tabela tb_fornecedor, que tem os outros campos listados acima.

Nesse exemplo eu obtenho sucesso pois são dois resultados do array mas como o primeiro resultado tem apenas uma ocorrência, o meu for incrementa a variavel $c logo no primeiro laço.

Agora, é possível que o usuario tente imprimir em outras colunas. Mostro isso na URL abaixo.

337

teste.php?nome_relatorio=&tipo_papel=P&tabela_relacionada=tb_nota_fiscal|&colunaRelacionada[4]=tb_nota_fiscal.total_nf%20as%20%22VALOR DA ULTIMA NOTA%22&colunaRelacionada[3]=tb_fornecedor.id_fornecedor%20as%20%22COD FORNECEDOR%22&colunaRelacionada[2]=tb_fornecedor.razao_fornecedor%20as%20%22RAZAO SOCIAL%22&colunaRelacionada[1]=tb_fornecedor.cnpj_fornecedor%20as%20%22CNPJ%22
Essa inversão faz com que o for incremente a variavel $c apenas na ultima passagem do foreach, o que é normal, mas está me dando problema pois com isso a query é gerada de forma errada.

 

Peço desculpas pelo tamanho do Post. Tentei resumir no máximo que pude.

Estou com esse problema a semanas e eu não estou encontrado solução. Sei que a lógica está errada. Mas não sei como arruma-la.

 

Ah, não reparem nas f

2ad

unções. Eu ainda não tenho grande experência em objetos.

 

Agradeço a atenção de vocês desde já.

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara que post imenso. :huh:

 

Vamos ver, se outros amigos não puderem assim como eu

entender todo o seu código, que tal agente tentar

entender só oque você quer fazer?

 

Vamos lá, pelo que entendi você tem um for que incrementa $c

enquanto o mesmo for menor que a quantidade de colunas relacionadas.

Então presupõe-se que enquanto existirem colunas relacionadas você quer fazer algo.

 

Em seguida vem um foreach em que você monta parte de uma query se $coluna[$i] for verdadeiro (ou exista) para utilizar dinamicamente mais tarde,

caso contrario você continua montando com $coluna[$i] (o que não faz muito sentido visto que naquela parte do seu código $coluna[$i] seria = a false ou vazio, mas isso não é o seu problema) na mesma query porem sem a variável $colunaSepara.

 

Depois você incrementa $i (Dica o foreach percorre o array em toda sua extensão de maneira que se você fizesse foreach($var AS $i=>$result) { } por exemplo você dispensaria a necessidade de utilizar $i++ visto que $i não é utilizado em momento algum fora daquele contexto) e por ultimo você da um break; e encerra o foreach.

Isso tudo eu entendi.

 

Agora qual é exatamente o problema que isso lhe gera?

Como seria a forma correta na qual deveria funcionar?

 

Da uma ajuda ae só pra podermos te responder com mais agilidade http://forum.imasters.com.br/public/style_emoticons/default/joia.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

E aí Periscuelo?

 

Consegui resolver o problema agora pouco. :lol:

O problema que isso me gerava era na hora de montar a query dinamica, uma vez que quando eu invertia o recebimento do array, se ele recebece o array com mais valores primeiro, a variavel $c só iria incrementar depois que o primeiro array fosse lido, o que é normal. Porém essa lógica minha estava errada.

Tirei esse for e fiz assim:

public function constructQueryReport($tableEnv,$columnEnv){
			$tableEnv=substr($tableEnv,0,strlen($tableEnv)-1);
			$tabelas= $this->report($tableEnv);
			$colunaRelacionada= $columnEnv;
			
			$tabela=array();
			$coluna=array();
			$b=0;
			$d=0;
			ksort($colunaRelacionada);
			
			foreach($colunaRelacionada as $a){
				$tabelaEnviada=explode(".",$a);
				
				if($_SESSION['tabelaEnv'] != $tabelaEnviada[0]){
				$_SESSION['tabelaEnv'] = $tabelaEnviada[0];
				$tabela[$b]=$tabelaEnviada[0];
				$b++;
				}
				
				$coluna[$d]=$tabelaEnviada[1];
				
				$d++;
			}
			$dinamicQuery="select ";
			$dinamicQuery1="select ";
			$leftJoin="";
			$leftJoin1="";
			$virgula="";
			foreach($colunaRelacionada as $a){
				$columnOnly=explode("as",$a);
				
				$dinamicQuery.=$a.",";
				$dinamicQuery1.=$columnOnly[0].",";
				
			}
			//aplica a formula na SQL
			if($_SESSION['formula']){
				foreach($_SESSION['formula'] as $calc){
					$explodeCalc=explode("|",$calc);
					$dinamicQuery.="(".$explodeCalc[0].")::numeric(10,2) as \"".$explodeCalc[1]."\",";
					$dinamicQuery1.="(".$explodeCalc[0].")::numeric(10,2) as \"".$explodeCalc[1]."\",";
				
				}
				
			}
			
				$dinamicQuery=substr($dinamicQuery,0,strlen($dinamicQuery)-1)." from $tableEnv";
				$dinamicQuery1=substr($dinamicQuery1,0,strlen($dinamicQuery1)-1)." from $tableEnv";
				//grava o parametro para comparação
				$tabelaParametro='';
			foreach($colunaRelacionada as $a){

				$tableOnly=explode(".",$a);
				$tables=$tabelas[$tableOnly[0]];
				$colunas = $tables[ 'colunas' ];
				$tabelaRef = $tables[ 'TabelaRef' ];
				$colunaRef = $tables[ 'ColunaRef' ];
				if($colunaRef){
				
					foreach($colunaRef as $B){
					
						if($tabelaRef != 'tb_fornecedor' and $tabelaRef != $tabelaParametro){
						$tabelaParametro=$tabelaRef;
						$leftJoin.= " inner join $tabelaRef on tb_fornecedor.$b = $tabelaRef.$b ";
						$leftJoin1.= " inner join $tabelaRef on tb_fornecedor.$b = $tabelaRef.$b ";
						}
					}
				}
			}
			
			$queryEnviada=array($dinamicQuery.$leftJoin,$dinamicQuery1.$leftJoin1);
		
			return $queryEnviada;
		
		}
Agradeço a sua atenção e peço desculpas a você e a todos que tentaram ler esse Post Gigante. Eu tentei resumir no máximo.

 

Abraço e obrigado mais uma vez. http://forum.imasters.com.br/public/style_emoticons/default/joia.gif

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.