Етикети - преброяване

nom3r1

Registered
Имам таблица `news` и в нея колона `etiketi`, в тази колона записвам етикетите в следния ред:

id | title | etiketi
1 | test | test, etiket, etiketi
2 | test2 | etiket, test2, etiketche

Искам да взема всеки етикет по отделно и да го вкарам в масив, без да се повтаря и да изкарам колко броя има т.е.

Ако имам 30 етикета с име `etiket` в 20 новини например да имам числото:

18.000

и 15 етикета с име `test` в 10 новини например да имам числото: 6.419

След, което разбира се ще изведа така:

PHP:
<?php
$factor = 0.5;
$starting_font_size = 11;
$tag_separator = '   ';

$etiketi = array('etiket'  => '18.000','test' => '6.419');

$max_count = array_sum($etiketi);
foreach($etiketi as $etiket => $rating) {
	$x = round(($rating * 100) / $max_count) * $factor;
	$font_size = $starting_font_size + $x.'px';
	echo "<span style='font-size: ".$font_size."; color: #f6f6f6;'><a href='#'>".$etiket."</a></span>".$tag_separator;
}
?>

И конкретния ми въпрос е как да изчисля числото в масива, колко пъти го има дадения етикет в таблицата `news`, колона `etiketi`?

$etiketi = array('etiket' => '18.000','test' => '6.419');
 
PHP:
<?php
$factor = 0.5;
$starting_font_size = 11;
$tag_separator = '   ';

$words = array();
$rc = mysql_query("select etiketi from news");
while ($r = mysql_fetch_array($rc)) 
	array_push( $words, explode(',',$r['etiketi'])); // добавяме индивидуалните етикети в масива

$etiketi = array_count_values($words);	// връща асоциативен масив със стойност и брой срещания
// DEBUG: print_r($etiketi);

//$etiketi = array('etiket'  => '18.000','test' => '6.419');

$max_count = array_sum($etiketi);
foreach($etiketi as $etiket => $rating) {
        $x = round(($rating * 100) / $max_count) * $factor;
        $font_size = $starting_font_size + $x.'px';
        echo "<span style='font-size: ".$font_size."; color: #f6f6f6;'><a href='#'>".$etiket."</a></span>".$tag_separator;
}
?>
 
Така
PHP:
$words = array_push($words, explode(',', $r['tags']));

или така си го написал

PHP:
array_push($words, explode(',', $r['tags']));

?

Защото второто е правилното.
 
И под двата начина пробвах, първо със втория, след което с първия - резултат:

Warning: array_count_values() [function.array-count-values]: Can only count STRING and INTEGER values! in /home/nom3r1/public_html/page.php on line 16

Warning: array_count_values() [function.array-count-values]: Can only count STRING and INTEGER values! in /home/nom3r1/public_html/page.php on line 16

Warning: array_count_values() [function.array-count-values]: Can only count STRING and INTEGER values! in /home/nom3r1/public_html/page.php on line 16

А ако го направя без цикъл а само:
$r = mysql_fetch_array($rc);

Warning: array_count_values() [function.array-count-values]: Can only count STRING and INTEGER values! in /home/nom3r1/public_html/page.php on line 16

И при двата варианта реда е:

$etiketi = array_count_values($words);
 
Препоръчвам ти, да записваш думите в базата данни чрез serialize или json.

$data = array(
'test', 'test2', 'test3'
);
$data = serialize($data);

UPDATE table SET etiketi = $data

$row = ..;
$row['etiketi'] = unserialize($row['etiketi']);
print_r($row['etiketi']);

Горе долу да схванеш структурата. :)
 

Back
Горе