Ir para conteúdo

POWERED BY:

Arquivado

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

Chirlison

[Resolvido] Pular índice do array caso ele esteja vazio

Recommended Posts

Boa tarde a todos!

Pessoal estou com o seguinte problema:

Tenho um vetor que nem todos os índices estão com valores.

Gostaria de saber como posso pular os índices do vetor que estão vazios e imprimir só os que tem valores?

Estou usando o seguinte código para imprimir as categorias que estão no array.

 

//Aqui, eu pego as categorias do formuário via post.
$categoria1 = $_POST['categoria1'];
$categoria2 = $_POST['categoria2'];
$categoria3 = $_POST['categoria3'];
$categoria4 = $_POST['categoria4'];
$categoria5 = $_POST['categoria5'];

$categorias=array($categoria1,$categoria2,$categoria3,$categoria4,$categoria5);

$todas_categorias = serialize($categorias);

//Aqui, eu insiro as categorias no banco de dados.
mysql_query("INSERT INTO campeonatos (categoria) values('$titulo')")or die("ERRO  ENCONTRADO: '.mysql_error()"); 

//Aqui, eu busco as categorias no banco de dados e imprimo as categorias dentro de um select.
$busca=mysql_query("SELECT * FROM campeonatos WHERE id='$id_campeonato'");
if(!mysql_num_rows($busca)){ 
echo 'Nenhum dado cadastrado na base de dados';
}else{
 	echo "<select name=\"categoria\" id=\"categoria\">";
 	while($ver=mysql_fetch_row($busca)){
               	$id=$ver[0];
				$categorias=$ver[10];
				}}

				$categorias=unserialize($categorias);	
				foreach($categorias as $indice => $valor){                   			
				if ($valor!="")
				echo "<option value='$valor'>$valor</option>";					
				}

 

Desde já, agradeço a todos que puderem me ajudar!

Um abraço a todos!

Compartilhar este post


Link para o post
Compartilhar em outros sites
<?
$array = array('um', 'dois', '', 'quatro', '', '', 'sete', '', '', 'dez');

while($chave = array_search('', $array))
unset($array[$chave]);

print_r($array);
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito obrigado jhrhp, pela ajuda.

Adaptei o seu código ao meu, mas não funcionou, os índices que estão vazios continuam sendo impressos.

Tem alguma idéia do que eu possa estar fazendo de errado?

 

$busca=mysql_query("SELECT * FROM campeonatos WHERE id='$id_campeonato'");
if(!mysql_num_rows($busca)){ 
echo 'Nenhum dado cadastrado na base de dados';
}else{
 	echo "<select name=\"categoria\" id=\"categoria\">";
 	while($ver=mysql_fetch_row($busca)){
               	$id=$ver[0];
				$categorias=$ver[10];
				}}

				$categorias=unserialize($categorias);	
				$array=$categorias;
				while($chave = array_search('', $array))
               	unset($array[$chave]);
				$teste=($array);

				foreach($teste as $valor){

				echo "<option value='$valor'>$valor</option>";	
               	}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na na ni na não:

 

$array = array('um', 'dois', '', 'quatro', '', '', 'sete', '', '', 'dez');

$array = array_filter( $array );

Por não mencionar um segundo parâmetro, de callback, definindo o que deverá ser removido do array, array_filter(0 assume os valores nulos comuns.

 

[EDIT]

 

Eu escrevia ao mesmo tempo que você :P

 

Essa operação de limpeza você vai fazer ANTES de usar o array no loop.

 

Se não quiser usa ela, DENTRO do loop você coloca um condicional (IF), se não for vazio

[ ! empty() ], você ecoa.

 

Mas você ainda pode filtrar direto pelo banco de dados utilizando uma Cláusula WHERE onde esse campo que você está testando não dva ser vazio.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bruno Augusto, obrigado pela resposta, mas continua imprimindo os índices que estão vazios.

Está imprimindo da seguinte forma:

 

Categoria:

 

Categoria3

Categoria4

Categoria5

 

 

Categoria8

Categoria9

Categoria10

 

Onde está em branco é onde no array o indice está vazio.

select.jpg

Veja como está o código agora:

 echo "<select name="\"categoria\"" id="\"categoria\"">";
 	while($ver=mysql_fetch_row($busca)){
               	$id=$ver[0];
				$categorias=$ver[10];

				}}

				$categorias=unserialize($categorias);	
				$array = array_filter($categorias); 												
				foreach($array as $valor){		                   						
				echo "<option value="$valor">$valor</option>";					
				}
          		echo "</select>";

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamos depurar, então. Coloque:

 

print '<pre>'; print_r( $categorias );

Logo após o unserialize() e outra vez após o array_filter(). Detalhe, antes de executar renomeie o $array para $categorias, já que não há necessidade de alocar mais espaço na memória nesse caso.

 

Daí execute e poste as duas saídas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Use a instrução "continue;", que serve para saltar um ou mais loops de alguma iteração.

 

foreach($categorias as $indice => $valor){ 
     if ($valor = "")    continue;     
          echo "<option value='$valor'>$valor</option>";       
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia a todos!

Pessoal, hoje pela manhã fiz o que o Bruno Augusto falou, depurei, colocando print '<pre>'; print_r( $categorias );

Veja como ficou o código:

 

$busca=mysql_query("SELECT * FROM campeonatos WHERE id='58'");
if(!mysql_num_rows($busca)){ 
echo 'Nenhum dado cadastrado na base de dados';
}else{
 	//echo "<select name=\"categoria\" id=\"categoria\">";
 	while($ver=mysql_fetch_row($busca)){
               	$id=$ver[0];
				$categorias=$ver[10];

				}}

				$categorias=unserialize($categorias);	

				print '<pre>'; print_r($categorias );

				$categorias = array_filter($categorias);

				print '<pre>'; print_r($categorias);

 

Aqui foi a saida que obtive:

 

Array( [0] => Categoria1 [1] => Categoria2 [2] => Categoria3 [3] => Categoria4 [4] => [5] => [6] => [7] => [8] => [9] => [10] => [11] => [12] => [13] => [14] => [15] => [16] => [17] => [18] => [19] => [20] => [21] => [22] => [23] => [24] => [25] => [26] => [27] => [28] => [29] => )Array( [0] => Categoria1 [1] => Categoria2 [2] => Categoria3 [3] => Categoria4 [5] => [6] => [7] => [8] => [9] => [11] => [16] => [17] => [18] => [19] => [25] => [26] => [27] => [28] => [29] => )

O problema é que não consigo eliminar os índices que estão vazios.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito estranho.

 

Testei aqui, pegando seu primeiro array e transformando-o num array de verdade (eu deveria ter pedido um var_export...) passei por array_filter(0 e limpou direitinho:

 

<?php 

$teste = Array(  
   'Categoria1',
   'Categoria2',
   'Categoria3',
   'Categoria4',
   '',
   '',
   '',
   '',
   '',
   '',
   '',
   '',
   '',
   '',
   '',
   '',
   '',
   '',
   '',
   '',
   '',
   '',
   '',
   '',
   '',
   '',
   '',
   '',
   ''
);

print '<pre>'; print_r( $teste );

$teste = array_filter( $teste );

print '<pre>'; print_r( $teste );

Saída:

Array
(
   [0] => Categoria1
   [1] => Categoria2
   [2] => Categoria3
   [3] => Categoria4
   [4] => 
   [5] => 
   [6] => 
   [7] => 
   [8] => 
   [9] => 
   [10] => 
   [11] => 
   [12] => 
   [13] => 
   [14] => 
   [15] => 
   [16] => 
   [17] => 
   [18] => 
   [19] => 
   [20] => 
   [21] => 
   [22] => 
   [23] => 
   [24] => 
   [25] => 
   [26] => 
   [27] => 
   [28] => 
)
Array
(
   [0] => Categoria1
   [1] => Categoria2
   [2] => Categoria3
   [3] => Categoria4
)

Deve ter alguma coisa mais que esteja influenciando.

 

Vamos limpar esse código então.

 

Você faz a query buscando tudo ( * ). Você não aparenta estar precisando de tudo, afinal usa só o primeiro e o décimo índices.

 

Supondo que o primeiro seja o ID e este ID seja o mesmo desse 58 que você usa, você pode removê-lo da query e quando precisar usar, puxar do mesmo lugar de onde esse 58 vêm.

 

Esse índice 10, no banco de dados a coluna tem um nome, óbvio. Então use-o na query:

 

"SELECT `nome_do_campo` FROM campeonatos WHERE id='58'"

Com isso, já que só haverá uma única linha com ID, que deve ser chave primária, igual a 58. Você já dispensa o while():

 

$busca = mysql_query( "SELECT `nome_do_campo` FROM campeonatos WHERE id='58'" );

if( $busca !== FALSE ) {

   $data = mysql_fetch_assoc( $busca );

   if( $data !== FALSE ) {

       // O arroba suprime o E_NOTICE indesejado

       $data = @unserialize( $data );

       if( $data !== FALSE ) {

           // Descomentar a linha abaixo se ainda tiver dados em branco
           // $data = array_filter( $data );

           print '<pre>'; print_r( $data );
       }

   } else {

       echo 'Nenhum dado cadastrado na base de dados';
   }
}

Já ficou mais limpo.

 

Se ainda assim continuar com informações branco, você tenta o que o Bezerk falou (que seria o que eu diria em seguida :P ):

 

Dentro do foreach que nessa limpeza iria onde agora está o print_r():

 

foreach( $data as $d ) {

   if( empty( $d ) ) {
       continue;
   }

   echo '...';
}

Ou, ao contrário:

 

foreach( $data as $d ) {

   if( ! empty( $d ) ) {

       echo '...';
   }
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bruno Augusto, rapaz muito obrigado pela ajuda!

Coloquei da forma que está abaixo, e não está imprimindo nada.

Nem os índices vazios.

include "config/config.php";
$busca = mysql_query( "SELECT categorias FROM campeonatos WHERE id='58'" );

if( $busca !== FALSE ) {

$data = mysql_fetch_assoc( $busca );

if( $data !== FALSE ) {

   	// O arroba suprime o E_NOTICE indesejado

   	$data = @unserialize( $data );

   	if( $data !== FALSE ) {

       	// Descomentar a linha abaixo se ainda tiver dados em branco
       	// $data = array_filter( $data );

       	print '<pre>'; print_r( $data );
   	}

} else {

   	echo 'Nenhum dado cadastrado na base de dados';
}
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

if( $busca !== FALSE ) {

 

Esta intrução está errada!

 

Teste assim;

if ( ! $busca ) {

 

Mesma coisa para $data.

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bezerk, fiz como você falou, mas continua sem imprimir nada.

Veja como ficou o código:

include "config/config.php";
$busca = mysql_query( "SELECT categorias FROM campeonatos WHERE id='58'" );

if(!$busca) {

   	$data = mysql_fetch_assoc( $busca );

   	if(!$data ) {

   	// O arroba suprime o E_NOTICE indesejado

   	$data = @unserialize( $data );

   	if(!$data) {

           	// Descomentar a linha abaixo se ainda tiver dados em branco
           	// $data = array_filter( $data );

           	print '<pre>'; print_r( $data );
   	}

   	} else {

   	echo 'Nenhum dado cadastrado na base de dados';
   	}
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa! você tá passando o id como string, tire o id de dentro das aspas simples.

 

$busca = mysql_query( "SELECT categorias FROM campeonatos WHERE id=58" );

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então force uma mensagem de erro;

 

coloque no inicio do seu código;

 

error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);]

 

Escreva a query

 

$busca = mysql_query( "SELECT categorias FROM campeonatos WHERE id = 58" ) or die("Erro na query: $busca. ".mysql_error())

 

e veja o que retorna.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Rapaz, é impressionante não retorna nada!

Continua sem imprimir as categorias.

 

Cadastrei 4 categorias no banco de dados.

Veja como as categorias estão gravadas no banco de dados:

 

a:30:{i:0;s:10:"Categoria1";i:1;s:10:"Categoria2";i:2;s:10:"Categoria3";i:3;s:10:"Categoria4";i:4;s:0:"";i:5;s:19:" ";i:6;s:20:" ";i:7;s:118:" ";i:8;s:118:" ";i:9;s:115:" ";i:10;s:0:"";i:11;s:103:" ";i:12;s:0:"";i:13;s:0:"";i:14;s:0:"";i:15;s:0:"";i:16;s:144:" ";i:17;s:144:" ";i:18;s:144:" ";i:19;s:144:" ";i:20;s:0:"";i:21;s:0:"";i:22;s:0:"";i:23;s:0:"";i:24;s:0:"";i:25;s:144:" ";i:26;s:144:" ";i:27;s:144:" ";i:28;s:144:" ";i:29;s:144:" ";}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Agora que eu vi, a lógica tá invertida;

 

você tá mandando imprimir se a query não retornar nada, ai não funciona mesmo.

 

Em tese, este código para imprimir os valores deveria ser;

 

if( $busca ) {

       $data = mysql_fetch_assoc( $busca );
       if( $data  ) {
       // O arroba suprime o E_NOTICE indesejado
       $data = @unserialize( $data );
          // Descomentar a linha abaixo se ainda tiver dados em branco
          // $data = array_filter( $data );
          print '<pre>'; print_r( $data );print'</pre>;'      
       } else {
          echo 'Nenhum dado cadastrado na base de dados';
       }
}

 

Testa ai.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desculpas.

Eu tinha errado o código.

Na verdade continua sem imprimir as categorias.

 

Estou tentando outras formas aqui para imprimir este array no select, mas está osso viu!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Dá um var_dump($data) no final do codigo.

 

 

 

 

Tem como você postar as estruturas das suas tabelas?

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esta é a estrutura da tabela na qual eu busco as categorias cadastradas.

 

-- -- Estrutura da tabela `campeonatos` --

 

CREATE TABLE `campeonatos` ( `id` int(11) NOT NULL auto_increment, `titulo` varchar(255) character set utf8 collate utf8_unicode_ci NOT NULL, `valor_inscricao` varchar(255) character set utf8 collate utf8_unicode_ci NOT NULL, `local` text character set utf8 collate utf8_unicode_ci NOT NULL, `premiacoes` text character set utf8 collate utf8_unicode_ci NOT NULL, `trofeus` text NOT NULL, `treinos` text character set utf8 collate utf8_unicode_ci NOT NULL, `maiores_informacoes` text character set utf8 collate utf8_unicode_ci NOT NULL, `status` varchar(255) character set utf8 collate utf8_unicode_ci NOT NULL, `data` date NOT NULL, `categorias` text character set utf8 collate utf8_unicode_ci NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=60 ;

 

Só para relembrar.

Com este código que está abaixo, eu consigo imprimir as categorias.

Mas, imprimi também alguns índices que estão vazios, como está na figura.

select.jpg

include "config/config.php";
$busca=mysql_query("SELECT * FROM campeonatos WHERE id='$id_campeonato'");
if(!mysql_num_rows($busca)){ 
echo 'Nenhum dado cadastrado na base de dados';
}else{
 	echo "<select name=\"categoria\" id=\"categoria\">";
 	while($ver=mysql_fetch_row($busca)){
               	$id=$ver[0];
				$categorias=$ver[10];

				}}

				$categorias=unserialize($categorias);	
				$array = array_filter($categorias);
				foreach($array as $valor){
				$valor=$valor;		               						
				echo "<option value='$valor'>$valor</option>";					
				}		

 

Aqui é como está as informações no campo categorias:

 

a:30:{i:0;s:10:"Categoria1";i:1;s:10:"Categoria2";i:2;s:10:"Categoria3";i:3;s:0:"";i:4;s:0:"";i:5;s:12:" ";i:6;s:12:" ";i:7;s:12:" ";i:8;s:12:" ";i:9;s:12:" ";i:10;s:0:"";i:11;s:12:" ";i:12;s:0:"";i:13;s:0:"";i:14;s:0:"";i:15;s:0:"";i:16;s:12:" ";i:17;s:12:" ";i:18;s:12:" ";i:19;s:12:" ";i:20;s:0:"";i:21;s:0:"";i:22;s:0:"";i:23;s:0:"";i:24;s:0:"";i:25;s:12:" ";i:26;s:12:" ";i:27;s:12:" ";i:28;s:12:" ";i:29;s:12:" ";}

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.