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 に答える