开发者

Limit a for each loop in a tag cloud

开发者 https://www.devze.com 2023-02-24 12:45 出处:网络
I have the following tag cl开发者_开发知识库oud. $rows = $db->loadObjectList(); foreach ($rows as $row)

I have the following tag cl开发者_开发知识库oud.

$rows = $db->loadObjectList();
foreach ($rows as $row)
{
$strAllTags .= $row->caption . ","; 
}

// Store frequency of words in an array
$freqData = array(); 

// Get individual words and build a frequency table
foreach( explode(",", $strAllTags) as $word )
{
// For each word found in the frequency table, increment its value by one
array_key_exists( trim($word), $freqData ) ? $freqData[ trim($word) ]++ : $freqData[ trim($word) ] = 0;
}


function getCloud( $data = array(), $minFontSize = 12, $maxFontSize = 32 )
{
$minimumCount = min( array_values( $data ) );
$maximumCount = max( array_values( $data ) );
$spread       = $maximumCount - $minimumCount;
$cloudHTML    = '';
$cloudTags    = array();

$spread = 55;

foreach( $data as $tag => $count )
{
            if ($count > 4)
            {
    $size = $minFontSize + ( $count - $minimumCount ) 
        * ( $maxFontSize - $minFontSize ) / $spread;
    $cloudTags[] = '[[a style="font-size: ' . floor( $size ) . 'px' 
    . '" class="tag_cloud" href="/home?func=search&searchfield=' . $tag 
    .  '"]]' 
    . htmlspecialchars( stripslashes( $tag ) ) . '[[/a]]';
           }
}

return join( "\n", $cloudTags ) . "\n";
}   
echo getCloud($freqData);
?>

It works fine, I simply need to limit it to the top 20 results, any ideas as to how to do this best?

Thanks, let me know if you need to see the rest of the code.


Take another counter variable and increment in loop and check if it is reached to 20 break the loop

OR

Use array_slice

$data = array_slice($data, 0, 20);

foreach( $data as $tag => $count )
{
.....


If your array isn't already sorted, you can use arsort() to sort it by the highest results. Then you can use array_slice() to create a new array with just the first 20 array elements:

arsort($data);
$data = array_slice($data, 0, 20);

arsort means "associative reverse sort". This just means that it acts on associative arrays, maintaining their keys, and sorts the array in "reverse" (i.e. high to low) order by it's values.

array_slice just "slices" up an existing array. In this example, it says "take the $data array, and return a new array containing 20 of its values, starting from the first one.

To address the point you made in the comments about this causing the tags to also be displayed in order by size, when you want them to be random. You can accomplish this by using shuffle on the array after you grab the top 20 records:

arsort($data);
$data = array_slice($data, 0, 20);
shuffle($data);
0

精彩评论

暂无评论...
验证码 换一张
取 消