View file app/Services/TagCloud.php

File size: 1.29Kb
<?php

declare(strict_types=1);

namespace App\Services;

class TagCloud
{
    /**
     * Generate cloud tags
     *
     * @param array $tags
     *
     * @return array|int[]
     */
    public function generate(array $tags): array
    {
        if (! $tags) {
            return [];
        }

        $min = min($tags);
        $max = max($tags);

        $links = [];

        $i = 0;
        foreach ($tags as $tag => $count) {
            $size = $this->getSize($count, $min, $max);

            if ($i & 1) {
                $links[$tag] = $size;
            } else {
                $links = [$tag => $size] + $links;
            }

            $i++;
        }


        return $links;
    }

    /**
     * Get size
     *
     * @param int $count
     * @param int $min
     * @param int $max
     * @param int $minSize
     * @param int $maxSize
     *
     * @return int
     */
    public function getSize(int $count, int $min, int $max, int $minSize = 10, int $maxSize = 30): int
    {
        $minCount = log($min);
        $maxCount = log($max);

        $diffSize  = $maxSize - $minSize;
        $diffCount = $maxCount - $minCount;

        if (empty($diffCount)) {
            $diffCount = 1;
        }

        return (int) round($minSize + (log($count) - $minCount) * ($diffSize / $diffCount));
    }
}