Ir para conteúdo

POWERED BY:

Arquivado

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

Douglas

Separar valores

Recommended Posts

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

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
  1. <?php
  2. // quebra a string onde houver espaços em branco, retornando somente elementos não vazios
  3. $array_categ = preg_split("/\s+/s", $string, -1, PREG_SPLIT_NO_EMPTY);
  4. // elimina elementos repetidos e junta numa string através de uma quebra de linha
  5. $str_categ = implode("\r\n", array_unique($array_categ));
  6. echo $str_categ;
  7. ?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

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

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

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

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

Olá, Douglas!

 

Eu fiz o seguinte teste:

 

PHP
  1. <?php
  2. $string = "categoria1 categoria2 categoria3
  3. categoria1
  4. categoria4 categoria2
  5. categoria1
  6. categoria1 categoria7";
  7. $array_categ = preg_split("/\s+/s", $string, -1, PREG_SPLIT_NO_EMPTY);
  8. $str_categ = implode("\r\n", array_unique($array_categ));
  9. echo $str_categ;
  10. ?>

 

E retornou:

categoria1

categoria2

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

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

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
  1. <?php
  2. $string = "";
  3. while (false !== ($linha = mysql_fetch_assoc($consulta))) {
  4. $string .= "\r\n".$linha["cats"];
  5. }
  6. ?>

 

[]'s!

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.