2

我有以下标签云。

$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);
?>

它工作得很好,我只需要将它限制在前 20 个结果中,关于如何做到最好的任何想法?

谢谢,如果您需要查看其余代码,请告诉我。

4

2 回答 2

3

取另一个计数器变量并在循环中递增并检查它是否达到 20 打破循环

或者

使用 array_slice

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

foreach( $data as $tag => $count )
{
.....
于 2011-04-14T16:09:50.990 回答
2

如果您的数组尚未排序,您可以使用arsort()它按最高结果对其进行排序。然后,您可以使用array_slice()前 20 个数组元素创建一个新数组:

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

arsort意思是“关联反向排序”。这只是意味着它作用于关联数组,维护它们的键,并按其值以“反向”(即从高到低)顺序对数组进行排序。

array_slice只需“切片”现有数组。在这个例子中,它说“获取$data数组,并返回一个包含 20 个值的新数组,从第一个数组开始。

为了解决您在评论中提出的观点,当您希望它们是随机的时,导致标签也按大小顺序显示。shuffle获取前 20 条记录后,您可以通过在数组上使用来完成此操作:

arsort($data);
$data = array_slice($data, 0, 20);
shuffle($data);
于 2011-04-14T16:13:03.583 回答