Ir para conteúdo

Arquivado

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

Wanderson Valerio

[Resolvido] Última repetição não aparecer elemento hr

Recommended Posts

E ai galera, tudo beleza?

 

Minha dúvida é o seguinte, vamos supor que estou criando um site, e chega no ponto que eu vou listar as últimas notícias na home por exemplo. É possível eu não repetir um elemento dentro de um laço, um <hr /> por exemplo, tipo:

 

// Código de busca ao banco
while ($result = mysql_fetch_array($query)) {
<div>
<h1><?php echo $titulo?></h1>
<p><?php echo $conteudo?></p>
<hr />
</div>
}

É possível não repetir esse <hr /> quando chegar ao último registro a ser exibido entre essas notícias? Se sim, agradeço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

é possível, sim. você só precisa ter um contador e o número total de registros. a cada iteração do loop, incremente o contador. antes de exibir a <hr />, faça um if para verificar se o contador é igual ao total de registros. Se for, não exiba a <hr />

Compartilhar este post


Link para o post
Compartilhar em outros sites

// Código de busca ao banco
while ($result = mysql_fetch_array($query)) {
array_pop($result);
<div>
<h1><?php echo $titulo?></h1>
<p><?php echo $conteudo?></p>
<hr />
</div>
}

 

array_pop

 

O que está em negrito é a função responsável por isso, faça um teste.

E lembre-se de colocar a abertura do <hr> depois de dar o array_pop.

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Leandro, você rodou esse código? Mesmo que com um array de exemplo (o que necessitaria de uma ligeira adaptação)?

 

<?php

$data = array(

   array( 'titulo' => 'Tiítulo #1', 'conteudo' => 'Conteúdo #1' ),
   array( 'titulo' => 'Tiítulo #2', 'conteudo' => 'Conteúdo #2' ),
   array( 'titulo' => 'Tiítulo #3', 'conteudo' => 'Conteúdo #3' ),
   array( 'titulo' => 'Tiítulo #4', 'conteudo' => 'Conteúdo #4' ),
   array( 'titulo' => 'Tiítulo #5', 'conteudo' => 'Conteúdo #5' )
);

$length = count( $data );

$i = 0;

// Código de busca ao banco
while( $i <= $length ) {

   array_pop( $data );

   var_dump( $data[ $i ] );

   $i += 1;
}

Saída:

 

array(2) {
 ["titulo"]=>
 string(11) "Tiítulo #1"
 ["conteudo"]=>
 string(12) "Conteúdo #1"
}
array(2) {
 ["titulo"]=>
 string(11) "Tiítulo #2"
 ["conteudo"]=>
 string(12) "Conteúdo #2"
}
NULL
NULL
NULL
NULL

Motivo: Na primeira iteração ($i = 0), array_pop() é invocado, removendo o último índice do array.

 

Nosso $length, definido com razão fora do loop, possui o valor 5, logo vai iterar 5 vezes. Mas como array_pop() foi invocado, o quinto elemento não existe mais. O primeiro índice já foi exibido.

 

Na segunda iteração ($i = 1), acontece de novo, e o segundo índice exibido.

 

Na terceira, quarta e quinta iterações $data já não tem mais elementos e array_pop() não tem mais efeito, restando apenas exibir o valor correntes. Mas como estes foram removidos nas duas primeiras iterações, eles também não existem, daí o NULL.

 

Para o Wanderson: Perceba no codigo usado acima para explicar ao Leandro, a solução sugerida pelo Beraldo já foi aplicada.

 

Nesse seu caso, bastaria adaptar um pouquinho:

 

<?php

$data = array(

   array( 'titulo' => 'Título #1', 'conteudo' => 'Conteúdo #1' ),
   array( 'titulo' => 'Título #2', 'conteudo' => 'Conteúdo #2' ),
   array( 'titulo' => 'Título #3', 'conteudo' => 'Conteúdo #3' ),
   array( 'titulo' => 'Título #4', 'conteudo' => 'Conteúdo #4' ),
   array( 'titulo' => 'Título #5', 'conteudo' => 'Conteúdo #5' )
);

$length = count( $data );

$i = 0;

// Código de busca ao banco
while( $i < $length ) {

   printf(

       "<div>\n

           <h1>%s</h1>\n\t\t

           <p>%s</p>\n\t\t

       </div>

       %s\n\t",

       $data[ $i ]['titulo'],

       $data[ $i ]['conteudo'],

       ( $i < ( $length - 1 ) ? "<hr />\n\t\t" : NULL )
   );

   $i += 1;
}

Ficou maior do que o necessário porque eu coloquei várias quebras de linha e tabulações para gerar um HTML mais legível. :closedeyes:

 

Mas o que importa para você é a variável $i, seu incremento ($i += 1) e o condicional que insere o <hr />:

 

( $i < ( $length - 1 ) ? "<hr />\n\t\t" : NULL )

Aqui é verificado se o valor atual da iteração ($i) é menor que o número total de elementos menos um, porque a contagem começa do zero.

 

Se for, insere o <hr />, se não, não insere.

 

Num código espaguete, essa instrução poderia estar dentro um IF simples, sem o ELSE (que seria onde esse NULL entraria).

 

Mas como eu já estava dentro do printf(), resolvi usar um ternário e, como estou temporariamente sem servidor local com PHP 5.3 ou superior, testei online e, por isso, tive de usar a forma completa do operador, que exige um ELSE, dai o NULL.

 

Certinho?

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.