Ir para conteúdo
Fórum Script Brasil
  • 0

Sistema de Ranking


marceloths

Pergunta

Tenho uma array com vários valores, quero elaborar um sistema de ranking bem simples, por exemplo tenho array com seguinte código:

$canal[0]='Globo';
$canal[1]='SBT';
$canal[2]='Globo';
$canal[3]='Globo';
$canal[4]='Record';
$canal[5]='SBT';

gostaria obter o ranking de canais mais acessados. Ex:

1º - Globo - 3 visitas

2º - SBT - 2 visitas

3º - Record - 1 visita

Só quero um pequeno exemplo.

Atenciosamente, Marcelo.

:mellow:

Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 0

mas o método da bolha é utlizado para ordenar os números e não o texto...

gostaria de um pequeno exemplo para ser montar um ranking simples somente com array.

Atenciosamente,

Marcelo.

Link para o comentário
Compartilhar em outros sites

  • 0

Você pode fazer assim:

//Variáveis
$sites=Array("Globo","SBT","Record","SBT","Globo","SBT"); //Array de sites
$qtd_visitas; //Número de visitas
$visitas; //Array de visitas
$i; //Contador
//Conta as visitas
foreach($sites as $i){
   //Verifica se o site já foi cadastrado nas visitas
   if(isset($visitas[$i])){
       //Se sim, incrementa a variável
       $visitas[$i]++;
   }else{
       //Se não,adciona no array de visitas com o valor em 1
       $visitas[$i]=1;
   }
}
$valor;
//Mostra as visitas
foreach($visitas as $i => $qtd_visitas){
    echo "$i: $qtd_visitas visita(s)<br>";
}

Link para o comentário
Compartilhar em outros sites

  • 0
Tenho uma array com vários valores, quero elaborar um sistema de ranking bem simples, por exemplo tenho array com seguinte código:

$canal[0]='Globo';
$canal[1]='SBT';
$canal[2]='Globo';
$canal[3]='Globo';
$canal[4]='Record';
$canal[5]='SBT';
gostaria obter o ranking de canais mais acessados. Ex: 1º - Globo - 3 visitas 2º - SBT - 2 visitas 3º - Record - 1 visita Só quero um pequeno exemplo. Atenciosamente, Marcelo. :mellow:
Bom amigo, você pode utilizar as funções nativas do PHP para fazer isso: array_filter: Irá criar um filtro utilizando uma função callback arsort: Irá ordernar sua matriz de forma reversa (O maior virá primeiro e o menor por último) Primeiro você cria a função callback para trabalhar com o array_filter:
/**
 * Pontua os elementos de uma matriz segundo o número de ocorrências
 * <p>
 * Caso seja passado o parâmetro $valor então assumiremos que estamos atuando como callback e
 * retornaremos sempre FALSE, se nenhum parâmetro for passado então assumiremos que estamos atuando
 * standalone e retornaremos uma matriz com a lista de elementos já pontuada e ordenada
 * </p>
 *
 * @param mixed $valor O elemento da matriz
 * @return boolean|array
 */
function rank( $valor = null ){
    static $lista = array();
    $ret = false;

    // Usamos func_num_args aqui para evitar um comportamento inesperado caso algum elemento da matriz contenha NULL
    if ( func_num_args() ){
        if ( $valor == NULL ) $valor = "NULL";

        if ( !isset( $lista[ $valor ] ) )
            $lista[ $valor ] = 1;
        else
            ++$lista[ $valor ];
    } else {
        $ret = $lista;

        //Ordenamos a matriz de forma reversa para que o elemento que tiver maior quantidade seje o primeiro da lista
        arsort( $ret );

        // Reiniciamos a matriz para que a função rank possa ser utilizada como callback novamente
        $lista = array();
    }

    return( $ret );
}
Depois de definido seu callback você pode trabalhar com sua matriz normalmente:
$canal[]='Globo';
$canal[]='Globo';
$canal[]='Globo';
$canal[]='SBT';
$canal[]='Globo';
$canal[]='Globo';
$canal[]='Record';
$canal[]='Record';
$canal[]='SBT';
$canal[]='SBT';
$canal[]='SBT';
$canal[]='Record';

// Fazemos o filtro na matriz
array_filter( $canal , "rank" );

// Chamamos a função rank agora sem ser como callback, para recuperar a lista:
var_dump( rank() );
?>
O código acima irá produzir:
array(3) {
    ["Globo"]=>
        int(5)
    ["SBT"]=>
        int(4)
    ["Record"]=>
        int(2)
}

[]'s

J. Neto

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...