Просмотр файла app/Services/TagCloud.php

Размер файла: 1.29Kb
  1. <?php
  2.  
  3. declare(strict_types=1);
  4.  
  5. namespace App\Services;
  6.  
  7. class TagCloud
  8. {
  9. /**
  10. * Generate cloud tags
  11. *
  12. * @param array $tags
  13. *
  14. * @return array|int[]
  15. */
  16. public function generate(array $tags): array
  17. {
  18. if (! $tags) {
  19. return [];
  20. }
  21.  
  22. $min = min($tags);
  23. $max = max($tags);
  24.  
  25. $links = [];
  26.  
  27. $i = 0;
  28. foreach ($tags as $tag => $count) {
  29. $size = $this->getSize($count, $min, $max);
  30.  
  31. if ($i & 1) {
  32. $links[$tag] = $size;
  33. } else {
  34. $links = [$tag => $size] + $links;
  35. }
  36.  
  37. $i++;
  38. }
  39.  
  40.  
  41. return $links;
  42. }
  43.  
  44. /**
  45. * Get size
  46. *
  47. * @param int $count
  48. * @param int $min
  49. * @param int $max
  50. * @param int $minSize
  51. * @param int $maxSize
  52. *
  53. * @return int
  54. */
  55. public function getSize(int $count, int $min, int $max, int $minSize = 10, int $maxSize = 30): int
  56. {
  57. $minCount = log($min);
  58. $maxCount = log($max);
  59.  
  60. $diffSize = $maxSize - $minSize;
  61. $diffCount = $maxCount - $minCount;
  62.  
  63. if (empty($diffCount)) {
  64. $diffCount = 1;
  65. }
  66.  
  67. return (int) round($minSize + (log($count) - $minCount) * ($diffSize / $diffCount));
  68. }
  69. }