Ограничить для каждого цикла в облаке тегов - PullRequest
2 голосов
/ 14 апреля 2011

У меня есть следующее облако тегов.

$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-ю результатами, есть идеи, как это сделать лучше всего?

Спасибо, дайте мне знать, если вам нужно увидеть остальную часть кода.

Ответы [ 2 ]

3 голосов
/ 14 апреля 2011

Возьмите другую переменную счетчика и увеличьте цикл и проверьте, достигнуто ли оно до 20, чтобы разорвать цикл

OR

Использовать array_slice

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

foreach( $data as $tag => $count )
{
.....
2 голосов
/ 14 апреля 2011

Если ваш массив еще не отсортирован, вы можете использовать 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);
...