Ir para conteúdo

POWERED BY:

Arquivado

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

Maykel-ctba

contador (operador ++) não está funcionando no foreach

Recommended Posts

Fala galera,

 

Tenho o seguinte trecho de código:

$arraySegmento = array("amarelo","azul","azul-claro","laranja","rosa","verde","vermelho");
$contadorSegmento = 0;

foreach ( $retorno as $secao ){
	$classSegmento = $arraySegmento[$contadorSegmento];
	$templateSegmentos .= "<li class=\"bg-segmento-".$classSegmento."\"></li>";
	$contadorSegmento++;
}

Porque o $contadorSegmento não está sendo incrementado a cada passagem do foreach? :/

Compartilhar este post


Link para o post
Compartilhar em outros sites
$arraySegmento = array("amarelo","azul","azul-claro","laranja","rosa","verde","vermelho");
$contadorSegmento = 0;
$templateSegmentos = '';
foreach ( $arraySegmento as $secao ){
$classSegmento = $arraySegmento[$contadorSegmento];
$templateSegmentos .= '<li class="bg-segmento-".$classSegmento.""></li>';
$contadorSegmento++;
}


echo $contadorSegmento;

Acho que você está colocando o nome da variável errado (no foreach)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não @Marcos,

 

O foreach está certo. $retorno é um array que vem com informações do banco de dados (que retirei do código acima pra ficar mais enxuto).

 

Está funcional.

 

Descobri outra maneira de fazer funcionar, mas gostaria de saber pq diabos assim não está funcionando, já fiz tantas vezes hahaha.

Compartilhar este post


Link para o post
Compartilhar em outros sites

É bem provável que seu array $retorno só tenha uma posição, aí só entra no loop uma vez.

 

Deveria funcionar normal. Veja um teste que fiz:

 

$retorno = range( 0, 6 );
$arraySegmento = array("amarelo","azul","azul-claro","laranja","rosa","verde","vermelho");
$contadorSegmento = 0;
foreach ( $retorno as $secao ){
    $classSegmento = $arraySegmento[$contadorSegmento];
    // $templateSegmentos .= "<li class=\"bg-segmento-".$classSegmento."\"></li>";
   
    var_dump( $contadorSegmento );
    var_dump( $classSegmento );
    $contadorSegmento++;
}

 

Saída:

 


$ php test.php
int(0)
string(7) "amarelo"
int(1)
string(4) "azul"
int(2)
string(10) "azul-claro"
int(3)
string(7) "laranja"
int(4)
string(4) "rosa"
int(5)
string(5) "verde"
int(6)
string(8) "vermelho"

 

o contador incrementou normalmente

Compartilhar este post


Link para o post
Compartilhar em outros sites

Putzzzz... verdade.

 

Realmente, $retorno retorna só 1.

 

Me embananei na lógica!

 

Ao invés de contar usando $retorno como base, devo usar outra coisa.

$resultado = $objMenu->simpleload(false);

if(!empty( $resultado ) ){
	foreach( $resultado as $menu ){
		$menuEstrutura = json_decode($menu['menEstrutura'], true);
	}
	
	$objSecao = new Secao();
	$objSecao->secAtivo = "S";
	$objSecao->secExcluido = "N";
	
	$templateSegmentos .= "<ul>";

	// * Nivel 01
	for( $i = 0; $i < count( $menuEstrutura ); $i++ ){
		$objSecao->secId = $menuEstrutura[$i]['id'];
		$retorno = $objSecao->simpleload(false);
		if( !empty( $retorno ) ){
			$arraySegmento = array("amarelo","azul","azul-claro","laranja","rosa","verde","vermelho");
			$contadorSegmento = 0;
			
			foreach ( $retorno as $secao ){
				$classSegmento = $arraySegmento[$contadorSegmento];
				$templateSegmentos .= "<li class=\"bg-segmento-".$classSegmento."\"><a href=\"#\" title=\"Ir para: ".$secao['secTitulo']."\">".$secao['secTitulo']."</a></li>";
				$contadorSegmento++;
			}
		}
	}
	$templateSegmentos .= "
	</ul>";
}

Nem precisei do contador. Usei o proprio $i.

 

Código funcionando:

$resultado = $objMenu->simpleload(false);

if(!empty( $resultado ) ){
	foreach( $resultado as $menu ){
		$menuEstrutura = json_decode($menu['menEstrutura'], true);
	}
	
	$objSecao = new Secao();
	$objSecao->secAtivo = "S";
	$objSecao->secExcluido = "N";
	
	$templateSegmentos .= "<ul>";

	// * Nivel 01
	for( $i = 0; $i < count( $menuEstrutura ); $i++ ){
		$objSecao->secId = $menuEstrutura[$i]['id'];
		$retorno = $objSecao->simpleload(false);
		if( !empty( $retorno ) ){
			$arraySegmento = array("amarelo","azul","verde","laranja","azul-claro","vermelho","rosa");	
			foreach ( $retorno as $secao ){
				$templateSegmentos .= "<li class=\"bg-segmento-".$arraySegmento[$i]."\"><a href=\"#\" title=\"Ir para: ".$secao['secTitulo']."\">".$secao['secTitulo']."</a></li>";
			}
		}
	}
	$templateSegmentos .= "
	</ul>";
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Por questão de performance, recomenda-se não utilizar a função count dentro de loopings. Atribua a uma variavel e coloque-a no for

$contador = count( $menuEstrutura );

for( $i = 0; $i < $contador; $i++ ){

Compartilhar este post


Link para o post
Compartilhar em outros sites

Por questão de performance, recomenda-se não utilizar a função count dentro de loopings. Atribua a uma variavel e coloque-a no for

De fato. Em loops extensos, isso ajuda bastante

 

Eu prefiro uma versão um pouco mais enxuta:

 

for( $i = 0, $contador = count( $menuEstrutura ); $i < $contador; $i++ )

Acho que o código fica mais limpo.

Mas isso é meramente questão de preferência :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não seria mais pesado criar a variavel, do que deixar do jeito que está?

Estando em variável ou não, vai ocupar o mesmo espaço em memória. Uma variável é só um "label", mas o espaço em memória é o mesmo

 

Chamar uma função causa um deslocamento de fluxo, pensando em baixo nível (assembly). Por isso é melhor só chamar a variável que a função

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.