Chirlison 1 Denunciar post Postado Novembro 3, 2011 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
jhrhp 15 Denunciar post Postado Novembro 3, 2011 <? $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
Chirlison 1 Denunciar post Postado Novembro 3, 2011 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
Bruno Augusto 417 Denunciar post Postado Novembro 3, 2011 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
Chirlison 1 Denunciar post Postado Novembro 3, 2011 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. 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
Bruno Augusto 417 Denunciar post Postado Novembro 3, 2011 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
Bezerk 3 Denunciar post Postado Novembro 3, 2011 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
Chirlison 1 Denunciar post Postado Novembro 4, 2011 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
Bruno Augusto 417 Denunciar post Postado Novembro 4, 2011 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
Chirlison 1 Denunciar post Postado Novembro 4, 2011 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
Bezerk 3 Denunciar post Postado Novembro 4, 2011 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
Chirlison 1 Denunciar post Postado Novembro 4, 2011 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
Bezerk 3 Denunciar post Postado Novembro 4, 2011 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
Chirlison 1 Denunciar post Postado Novembro 4, 2011 Tirei o id de dentro das aspas simples, mesmo assim continua sem imprimir nada. Compartilhar este post Link para o post Compartilhar em outros sites
Bezerk 3 Denunciar post Postado Novembro 4, 2011 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
Chirlison 1 Denunciar post Postado Novembro 4, 2011 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
Bezerk 3 Denunciar post Postado Novembro 4, 2011 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
Chirlison 1 Denunciar post Postado Novembro 4, 2011 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
Bezerk 3 Denunciar post Postado Novembro 4, 2011 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
Chirlison 1 Denunciar post Postado Novembro 4, 2011 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. 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