我有以下标签云。
$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位的结果,任何关于如何做到这一点的想法?
谢谢,如果您需要查看剩下的代码,请告诉我。
答案 0 :(得分:3)
取另一个计数器变量并在循环中递增并检查它是否达到20打破循环
OR
使用array_slice
$data = array_slice($data, 0, 20);
foreach( $data as $tag => $count )
{
.....
答案 1 :(得分:2)
如果您的数组尚未排序,则可以使用arsort()
按最高结果对其进行排序。然后,您可以使用array_slice()
创建一个仅包含前20个数组元素的新数组:
arsort($data);
$data = array_slice($data, 0, 20);
arsort
表示“关联反向排序”。这只意味着它作用于关联数组,维护它们的键,并按照它的值以“反向”(即从高到低)的顺序对数组进行排序。
array_slice
只是“切片”现有数组。在这个例子中,它表示“取$data
数组,并返回一个包含20个值的新数组,从第一个开始。
要解决您在评论中提出的这一点,导致标签也按大小顺序显示,当您希望它们是随机的时。在获取前20条记录后,您可以通过在阵列上使用shuffle
来实现此目的:
arsort($data);
$data = array_slice($data, 0, 20);
shuffle($data);