Create an array for a tag cloud in PHP

Tags: , , ,

Everyone tells us how to create a tag cloud with an array.. but how to actually create the array with the data that we fetch from our database?

This is how I do it. The table we are working in is “pictures” and the field with the tags is “tags“. The tags are separated with a space (for example: sunset beautiful evening).

$query = mysql_query('select * from pictures where tags != "" group by tags');

while ($fetch = mysql_fetch_assoc($query)) {
	$ex = explode(" ", $fetch['tags']);
	$c = count($ex);
	for ($i = 0; $i < $c; $i++) {
		$tags[] .= $ex[$i];
	}
}

What I do is fetch the data from all the fields named “tags” that are not empty. Then I separate the tags with the explode() function and I get an array. I count this array and I add every member of this array to my $tags array, which is the array that will include all the tags and which I’m going to use.

Then the usual code comes into play:

$c = array_count_values($tags); //count the array

$max_size = 32; //max size of the font in pixels
$min_size = 11; //min size of the font

$max_qty = max(array_values($c));
$min_qty = min(array_values($c));

$spread = $max_qty - $min_qty;
if ($spread == 0) {
	$spread = 1;
}

$step = ($max_size - $min_size) / ($spread);

foreach ($c as $key => $value) {
	$size = round($min_size + (($value - $min_qty) * $step)) . 'px';
	$title = $value . ' pictures with the tag ' . $key;
echo '<span style="font-size: ' . $size . '" title="' . $title . '">' . $key . '</span> ';
}

This is it, all you need is a field in the table with the name tags and then you save your tags there, separated with a blank space.

If you have any questions feel free to ask, if you think I don’t know how to write in english please tell me and I will try harder :D If you think this code sucks and have a better one please post it in the comments!

If you liked this post think about subscribing to my RSS feed and prevent missing anything interesting. It's free, fast and doesn't hurt. Promise. Click here.
Related posts: