Ir para conteúdo

POWERED BY:

Arquivado

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

porao

[Resolvido] Contar frequencia de valor em um array

Recommended Posts

Olá pessoal, tenho uma dúvida casca grossa, onde tenho quebrado a caxola e nao tem jeito de resolver.

Tanto é que resolvi apelar para vcs.

A duvida é a seguinte, tenho uma banco de dados assim(estrutura e valores):

 

Tabela avaliacoes
id........usuario........avaliacao.........data
8692.......916..............bom....2008-01-28 12:00:30
105.........36..............bom....2006-09-23 11:00:11
24..........27.............medio...2006-09-20 17:26:28
80...........1..............bom....2006-09-22 20:29:58
455.........45..............ruim...2006-09-22 20:29:58
3434........64..............bom....2006-09-22 20:29:58
Quero fazer um SELECT nesta tabela desta forma:

$xres = mysql_query("SELECT avaliacao FROM avaliacoes WHERE id = $id");
$xarr = mysql_fetch_array($xres);
e imprimir a frequencia em que aparece as avaliaçoes somente com o select acima:

 

$bom= $xarr[bom];
if ($bom>0)
echo 'Existem $bom avaliaçoes com [b]bom[/b]'; //saida seria: Existe 4 avaliaçoes BOM

$medio= $xarr[medio];
if ($medio>0)
echo 'Existe $medio avaliaçoes com [b]medio[/b]'; //saida seria: Existe 1 avaliaçoes MEDIO

$ruim= $xarr[ruim];
if ($ruim>0)
echo 'Existe $ruim avaliaçoes com [b]ruim[/b]'; //saida seria: Existe 1 avaliaçoes RUIM

Eu nao consegui de jeito nenhum, por favor me ajudem!

 

Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pela resposta amigo.

 

Com sua ajuda achei esta função:

 

<?php

// Answers Array
$array = array('a', 'b', 'a', 'a', 'c', 'a', 'd', 'a', 'c', 'd');

// Start Count Function
function count_repeat_values($needle, $haystack){
   
    $x = count($haystack);
   
    for($i = 0; $i < $x; $i++){
       
        if($haystack[$i] == $needle){
            $needle_array[] = $haystack[$i];
        }
    }
   
    $number_of_instances = count($needle_array);
   
    return $number_of_instances;
}

echo count_repeat_values('a', $array);

// will return the value 5
?>
No exemplo acima ele funciona perfeitamente, mas quando eu puxo um array do meu DB nao funciona

To fazendo assim, usando a mesma função acima:

Tabela avaliacoes
id........usuario........avaliacao.........data
8692.......916..............17....2008-01-28 12:00:30
105.........36..............33....2006-09-23 11:00:11
24..........27.............33...2006-09-20 17:26:28
80...........1..............35....2006-09-22 20:29:58
455.........45..............17...2006-09-22 20:29:58
3434........64..............26....2006-09-22 20:29:58

$xres = mysql_query("SELECT avaliacao FROM avaliacoes WHERE id= $id");
$xarr = mysql_fetch_array($xres);

$avalia7 = count_repeat_values('17', $xarr);

No db tenho 2 registros com valor '17' so que ele so conta 1...nao to conseguindo gente, ta feia a coisa. help

Será que eu nao to conseguindo transformar os registros do DB em array, para a função poder contar corretamete?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha, o mais fácil é fazer direto na query. Seria algo assim.

 

SELECT COUNT('avaliacao') AS total FROM forum WHERE id = $id GROUP BY avaliacao

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Será amigo, eu ja tinha tentado isso, mas dai teria que fazer varias consultas..uma pra cada tipo avaliação?

Lembrando que quero deixar somente uma consulta ao DB para todas as avaliaçoes.

E indo direto na query será que da para colocar condiçoes?


if ($xarr['17'] > 0) //se a contagem de avaliaçao 17 for maior que zero
echo 'Existem $xarr['17] avaliaçoes com [b]17[/b]'; //saida seria: Existe 2 avaliaçoes 17

if ($xarr['15'] > 0) //se a contagem de avaliaçao 15 for maior que zero
echo 'Existe $xarr['15'] avaliaçoes com [b]15[/b]'; //saida seria: Existe 1 avaliaçoes 15

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se eu troco a consulta:

$xres = mysql_query("SELECT avaliacao FROM avaliacoes WHERE id= $id");
$xarr = mysql_fetch_array($xres);
por:

 

$array = array('17', '17', '55', '23', '42', '15', '567', '875', '54', '99');

funciona perfeitamente..isso que nao entendo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Edit: Tinha feito invertida a consulta. http://forum.imasters.com.br/public/style_emoticons/default/assobiando.gif

 

É que você não passou oque deveria para o count.

$xres = mysql_query("SELECT avaliacao FROM avaliacoes WHERE avaliacao= 17");
while( $xarr = mysql_fetch_assoc($xres) ){
   $avaliacoes = $xarr['avaliacao'];}

$avalia7 = count_repeat_values(17, $avaliacoes );
ai sim, você está passando o array de avaliações

 

Atente para o fato de precisar passar um array.

 

A função count realmente está correta.

Mas não analisei outra forma de fazer oque você quer.

 

Tem como especificar o problema ? talvez haja outra maneira mais correta, mesmo que a que apresentei funcione.

 

Agora que vi, oque você quer é esta consulta:

$sql = "SELECT COUNT(avaliacao) AS c_avaliacao, avaliacao FROM avaliacao GROUP BY avaliacao";
	$q = mysql_query($sql);
	
	while( $dados = mysql_fetch_assoc( $q ) )
		echo 'Existem: '.$dados['c_avaliacao'].' avaliações com : '.$dados['avaliacao'].'<br />';

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso, so que eu quero que ele so imprima a avaliação que a contagem for != de zero:

No meu DB terá 5 avaliações possiveis: 11, 15, 16, 17, 18

 

Entao eu concatenei os resultados assim:

if ($dados['c_id'] > 0);//se existir avaliaçoes com o valor 15
$ava.= "- Voce possui ".$dados['c_id']." avaliaçoes 15";

if ($dados['c_id'] > 0);//se existir avaliaçoes com o valor 14
$ava.= "- Voce possui ".$dados['c_id']." avaliaçoes 14";

echo $ava;

 

 

Por isso que neste caso abaixo, como ele sabera que a avaliação foi 15?

if ($dados['c_id'] > 0);
$ava.= "- Voce possui ".$dados['c_id']." avaliaçoes 15";

 

 

A parada ta complicada mesmo, to desde ontem de manha tentando varias anternativas

Compartilhar este post


Link para o post
Compartilhar em outros sites

Edit: Tinha feito invertida a consulta. http://forum.imasters.com.br/public/style_emoticons/default/assobiando.gif

Olha de novo o meu post, eu tinha feito ao contrário.

http://forum.imasters.com.br/index.php?/topic/366139-contar-frequencia-de-valor-em-um-array/page__view__findpost__p__1401204

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nao funcionou amigo, quando ele verifica a condição if ($avalia >0) ele ja nem retorna.

 

Vou postar exatamente o codigo aqui que to usando, eu tava tentando simplificar pra ficar mais facil de entender:

Tabela avaliacoes
trabalho....usuario......avaliacao.........data
8692.......916..............17......2008-01-28 12:00:30
105.........36..............14......2006-09-23 11:00:11
24..........27.............14.......2006-09-20 17:26:28
80...........1..............11......2006-09-22 20:29:58
455.........45..............17......2006-09-22 20:29:58
3434........64..............17......2006-09-22 20:29:58

//função pra contar frequencia de array
function count_repeat_values($needle, $haystack){
    $x = count($haystack);
    for($i = 0; $i < $x; $i++){
        if($haystack[$i] == $needle){
            $needle_array[] = $haystack[$i];
        }
    }
    $number_of_instances = count($needle_array);
    return $number_of_instances;
}

 

Aqui o codigo php

//unico select que deve ter o arquivo(com varias consultas eu consegui..mas nao é este o objetivo.
//O objetivo é fazer tudo com uma consulta ao DB somente
$xres = mysql_query("SELECT avaliacao FROM avaliacoes WHERE trabalho= $id"); //seleciona todas as avaliaçoes para usuario X
#$xrow = mysql_fetch_array($xres);
while( $xarr = mysql_fetch_assoc($xres) ){
   $ids = $xarr['avaliacao'];}

$avalia = count_repeat_values('15', $ids); //conta frequencia de avaliaçao 15 para o usuario X
if ($avalia >0)
$aval.="- Voce recebeu(<a href=avaliat.php?id=$id&tpo=17&tipo=sim><font style=\"font-weight:bold;color:green\">" . $avalia . "</font></a>) avaliações 15 ";//concatena


$avalia2 = count_repeat_values('14', $ids);//conta frequencia de avaliaçao 14 para o usuario X
if ($avalia2 >0)
$aval.="- Voce recebeu(<a href=avaliat.php?id=$id&tpo=17&tipo=sim><font style=\"font-weight:bold;color:green\">" . $avalia2 . "</font></a>) avaliações 14 ";//concatena
echo $aval;//imprime resultados

Realmente é uma charada isso

 

EDIT----------

lembrando que se eu substituo a consulta ao DB pelo codigo abaixo funciona perfeitamente...:

// Answers Array
$array = array('17', '17', '14', '17', '11', '11', '12', '13', '17', '18');

Compartilhar este post


Link para o post
Compartilhar em outros sites

Poste o SQL da sua tabela..

se id é uma chave primária, não tem como um mesmo usuário ter várias avaliações.

 

Poste com alguns registros tb... visto que essa tabelinha não parece ter a informação real da coisa, e com ela eu não consigo simular o ambiente aqui.Exporte a tabela no SQL.

Compartilhar este post


Link para o post
Compartilhar em outros sites

tabela TRABALHO tinha mudado pra ID pra ficar mais facil..acabou ficando mais dificil rs

vou mudar la em cima pra ficar melhor

CREATE TABLE IF NOT EXISTS `avaliacoes` (
  `trabalho` int(10) unsigned NOT NULL default '0',
  `usuario` int(10) unsigned NOT NULL default '0',
  `avaliacao` tinyint(3) unsigned NOT NULL default '0',
  `data` datetime NOT NULL default '0000-00-00 00:00:00',
  PRIMARY KEY  (`trabalho`,`usuario`),
  KEY `usuario` (`usuario`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO `avaliacoes` (`trabalho`, `usuario`, `avaliacao`, `data`) VALUES
(8692, 916, 15, '2008-01-28 12:00:30'),
(105, 36, 17, '2006-09-23 11:00:11'),
(24, 27, 17, '2006-09-20 17:26:28'),
(80, 1, 14, '2006-09-22 20:29:58');

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tá.. vejamos:

$sql = "SELECT COUNT(avaliacao) AS c_avaliacao, avaliacao, trabalho FROM avaliacoes GROUP BY avaliacao";
	$q = mysql_query($sql);
	
	while( $dados = mysql_fetch_assoc( $q ) )
		echo 'Existem: '.$dados['c_avaliacao'].' avaliações : '.$dados['avaliacao'].'<br />';
saida:

Existem: 1 avaliações : 14

Existem: 1 avaliações : 15

Existem: 2 avaliações : 17

mas ainda não entendi oque esses dados representam.. tá me parecendo que você modelou errado, e que não era essa modelagem que você precisa.

 

Ou tô enganado? e é esta saída que você quer?

Pq na modelagem atual, não vejo como relacionar as avaliações com os trabalhos, pois o campo 'trabalho', não se repete.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que eu queria é que tivesse esta saida:

Avaliações: avaliaçoes 15(3) - avaliaçoes 14(1)...

 

Dai quando o usuario clicaria no numero de avaliaçoes(em negrito) e veria quem avaliou em uma lista.

 

Mas se as avaliaçoes so tiverem "avaliaçoes 15" e nao tivesse nenhum outro tipo se avaliaçao, ficaria assim:

Avaliações: avaliaçoes 15(3)

 

Os outros nao apareceriam por causa de algum condicional na concatenação

Compartilhar este post


Link para o post
Compartilhar em outros sites

confuso hein?! HAuhAuhAuhAua

 

mas então a saída que você quer é esta mesmo, ne?! tá certo..

Qual é a dificuldade agora?

 

com esse SQL foi gerado o:

echo 'avaliações : '.$dados['avaliacao'].'<a href="leva para algum lugar">('.$dados['c_avaliacao'].')</a><br />';
só precisa então implementar o link de cada um?

 

tenta fazer.. manda um parâmetro pra URL para iniciar a outra query..

Compartilhar este post


Link para o post
Compartilhar em outros sites

AHuahHHAuahHUAUH

Sim muito confuso, to com um nó da cabeça aqui

 

To tentando com a sua dica, vamos ver se da, ja posto o resultado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo, acho que com sua dica funcionou..ACHO pq preciso testar mais com todas condiçoes para eu ter 100% de certeza.

Eu so fiz algumas modificaçoes.

 

Vou postar o codigo aqui, se alguem um dia tiver o mesmo problema que eu, espero que ajude:

 

$xres = mysql_query("SELECT COUNT(avaliacao) AS c_avaliacao, avaliacao, trabalho FROM avaliacoes WHERE trabalho = $id GROUP BY avaliacao ORDER BY avaliacao DESC");

while($xarr = mysql_fetch_assoc($xres) ){
if ($xarr['avaliacao'] =='17'){
$tipo="Avaliaçoes 17";
$cor="green";
}elseif($xarr['avaliacao'] =='16'){
$tipo="Avaliaçoes 16";
$cor="red";
}elseif($xarr['avaliacao'] =='15'){
$tipo="Avaliaçoes 15";
$cor="red";
}elseif($xarr['avaliacao'] =='14'){
$tipo="Avaliaçoes 14";
$cor="red";
}elseif($xarr['avaliacao'] =='13'){
$tipo="Avaliaçoes 13";
$cor="red";
}elseif($xarr['avaliacao'] =='12'){
$tipo="Avaliaçoes 12";
$cor="red";
}elseif($xarr['avaliacao'] =='11'){
$tipo="Avaliaçoes 11";
$cor="red";
}else{
$tipo="";
}
   $ids = $xarr['c_avaliacao'];

if ($ids >0)
$aval.="- ".$tipo."(<a href=avaliat.php?id=$id&tpo=17&tipo=sim><font style=\"font-weight:bold;color:".$cor."\">" . $xarr['c_avaliacao'] . "</font></a>) ";
;}

	print("<b>Avaliação: </b><small>".$aval."</small></br>");

Vai imprimir se tiver avaliaçoes:

Avaliação: Avaliaçoes 17(3) - Avaliaçoes 15(1)....

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muitissimo obrigado amigos! ganhei o dia sem duvida!

Qualquer coisa estou aiVou continuar fazendo testes neste codigo, qualquer coisa posto ai

Compartilhar este post


Link para o post
Compartilhar em outros sites

Dá uma reestudada em php amigo.. o teu código ainda é bem confuso... veja:

if( $xarr['avaliacao'] >= 17 ){
	$tipo = 'Avaliaçoes 17';
	$cor = 'green';
}
else if( $xarr['avaliacao']<17 && $xarr['avaliacao']>=11 )
{
	$tipo = 'Avaliaçoes '.$xarr['avaliacao'];
	$cor = 'red';	
}
else
	$tipo = '';
é o mesmo que:

if ($xarr['avaliacao'] =='17'){
$tipo="Avaliaçoes 17";
$cor="green";
}elseif($xarr['avaliacao'] =='16'){
$tipo="Avaliaçoes 16";
$cor="red";
}elseif($xarr['avaliacao'] =='15'){
$tipo="Avaliaçoes 15";
$cor="red";
}elseif($xarr['avaliacao'] =='14'){
$tipo="Avaliaçoes 14";
$cor="red";
}elseif($xarr['avaliacao'] =='13'){
$tipo="Avaliaçoes 13";
$cor="red";
}elseif($xarr['avaliacao'] =='12'){
$tipo="Avaliaçoes 12";
$cor="red";
}elseif($xarr['avaliacao'] =='11'){
$tipo="Avaliaçoes 11";
$cor="red";
}else{
$tipo="";
}

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.