Douglas 6 Denunciar post Postado Maio 21, 2005 Pessoal, Eu tenho um campo (texto longo), que vai conter vários valores separados por espaço. Ex.: id|cats 1. categoria1 categoria2 categoria3 2. categoria1 3. categoria 4 categoria 2 4. categoria1 5. categoria1 categoria7 Como eu faria para listar esses valores sem repetir os itens e cada item por linha. Preciso exibir os dados da seguinte forma. categoria1 categoria2 categoria3 categoria4 categoria7 // Não é necessário estar em ordem. Tentei com explode, mas não consegui nada. Compartilhar este post Link para o post Compartilhar em outros sites
Illidan 0 Denunciar post Postado Maio 21, 2005 você pode utilizar a função preg_split, que faz o mesmo que o explode() utilizando expressões regulares... aí você usa a array_unique() pra eliminar os elementos repetidos do array e a implode() pra juntar tudo numa string. Ficaria mais ou menos assim: PHP <?php // quebra a string onde houver espaços em branco, retornando somente elementos não vazios $array_categ = preg_split("/\s+/s", $string, -1, PREG_SPLIT_NO_EMPTY); // elimina elementos repetidos e junta numa string através de uma quebra de linha $str_categ = implode("\r\n", array_unique($array_categ)); echo $str_categ; ?> Compartilhar este post Link para o post Compartilhar em outros sites
Cyber_Not 0 Denunciar post Postado Maio 21, 2005 o que a expressão regular /\s+/s faz? qual o função do s nisto? poderia ser /\s+/i ?O PREG_SPLIT_NO_EMPTY serve para não colocar valores vazios ? tipo para nãoa aparecer isso ?1-categoria 12-3-categoria3Até Compartilhar este post Link para o post Compartilhar em outros sites
Illidan 0 Denunciar post Postado Maio 21, 2005 Cyber Not, O "\s" serve pra casar todos os caracteres de espaço (barra de espaço, tabs e novas linhas... acho que só esses). O "+" é um quantificador que diz pra casar o caractere que vem antes dele 1 ou mais vezes. O PREG_SPLIT_NO_EMPTY é exatamente pra isso que você falou... você perguntou tb o sentido do modificador "s"... bom, ele diz pra função interpretar a $string como se fosse uma linha só. Eu não sei no caso da preg_split, mas na preg_match e preg_replace, se você não passar o modificador "s" (ou "m", que significa multilinha), a função vai considerar somente a primeira linha da string. O modificador "i" que você citou serve pra transformar a busca em case insensitive. No nosso caso, não tem necessidade, pois estamos buscando somente caracteres em branco... Falou! Compartilhar este post Link para o post Compartilhar em outros sites
Cyber_Not 0 Denunciar post Postado Maio 21, 2005 Então se não colocasse o "+" ele só acharia um espaço em branco?até Compartilhar este post Link para o post Compartilhar em outros sites
Eclesiastes 2 Denunciar post Postado Maio 21, 2005 Douglas, Siga o exemplo: PHP [*]<? [*] [*]// Consulta [*]// ..... [*] [*]while ($rs = mysql_fetch_array($Consulta)) [*] $Cat[] = $rs["cats"]; [*] [*]// Eliminando valores repetidos [*]$Cats = array_unique($Cat); [*] [*]// Deixando em ordem [*]natsort($Cats); [*] [*]// Exibindo os valores [*]foreach ($Cats as $Nomes) [*] echo $Nomes .""; [*] [*]?> Compartilhar este post Link para o post Compartilhar em outros sites
Douglas 6 Denunciar post Postado Maio 21, 2005 Pessoal funcionou em partes. Os dois scripts funcionam, só que porque exemplo se eu tiver uma mesma cateoria na segunda palavra ele não à remove.Primeiro script (Obrigado Illidan).Ex.: id | cats1. categoria1 categoria22. categoria13. categoria14. categoria7 categoria1Ele retorna.categoria1 categoria2 categoria1 categoria7 categoria1E o segundo script. (Obrigado Justice)categoria1categoria1 categoria2categoria7 categoria1OBS. Estou utilizando o DISTINCT na sql. Compartilhar este post Link para o post Compartilhar em outros sites
Eclesiastes 2 Denunciar post Postado Maio 22, 2005 Desculpa amigo... Esqueci de um detalhe... hehehe... Troque: while ($rs = mysql_fetch_array($Consulta)) $Cat[] = $rs["cats"]; Coloque: PHP [*]while ($rs = mysql_fetch_array($Consulta)) { [*] [*] $Infos = explode(" ", $rs["cats"]); [*] [*] if (count($Infos) > 1) [*] $Cat[] = $rs["cats"]; [*] else [*] foreach ($Infos as $valores) [*] $Cat[] = $valores; [*] [*]} Compartilhar este post Link para o post Compartilhar em outros sites
Illidan 0 Denunciar post Postado Maio 23, 2005 Olá, Douglas! Eu fiz o seguinte teste: PHP <?php $string = "categoria1 categoria2 categoria3 categoria1 categoria4 categoria2 categoria1 categoria1 categoria7"; $array_categ = preg_split("/\s+/s", $string, -1, PREG_SPLIT_NO_EMPTY); $str_categ = implode("\r\n", array_unique($array_categ)); echo $str_categ; ?> E retornou: categoria1categoria2 categoria3 categoria4 categoria7 Aparentemente, funcionaria... teria como você passar uma parte do seu script pra eu ver melhor como está o conteúdo da variável $string? Compartilhar este post Link para o post Compartilhar em outros sites
Douglas 6 Denunciar post Postado Maio 23, 2005 Valeu pessoal..Illidan, mas ai você está utilizando um variável que já contém todos os dados. Quando é retornado de um banco de dados não é diferente?Justice, retornou da mesma forma que o script anterior. Compartilhar este post Link para o post Compartilhar em outros sites
Illidan 0 Denunciar post Postado Maio 23, 2005 Ah, agora entendi... aquele esquema do 1o. post é como está o seu banco de dados. Realmente, seria diferente... pra você pegar o que está no banco de dados e definir a variável $string do jeito que está no meu código ali em cima, poderia fazer o seguinte: PHP <?php $string = ""; while (false !== ($linha = mysql_fetch_assoc($consulta))) { $string .= "\r\n".$linha["cats"]; } ?> []'s! Compartilhar este post Link para o post Compartilhar em outros sites
Eclesiastes 2 Denunciar post Postado Maio 23, 2005 Aff.... Que vacilo eu dei.. invetir > por < :S PHP [*]while ($rs = mysql_fetch_array($Consulta)) { [*] [*] $Infos = explode(" ", $rs["cats"]); [*] [*] if (count($Infos) <= 1) [*] $Cat[] = $rs["cats"]; [*] else [*] foreach ($Infos as $valores) [*] $Cat[] = $valores; [*] [*]} Compartilhar este post Link para o post Compartilhar em outros sites