Tag.php 3.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. <?php
  2. namespace Muzich\CoreBundle\lib;
  3. /**
  4. * Boite a outils pour les Tags.
  5. */
  6. class Tag
  7. {
  8. /**
  9. *
  10. * @param array $elements Tableau d'éléments
  11. * @return array Tableau de tags [0 => id_tag, 1 => id_tag] rangé du tag le
  12. * plus utilisé au tag le moins utilisé
  13. */
  14. public function getOrderedTagsWithElements($elements)
  15. {
  16. $tags_count = array();
  17. $tags_ordered = array();
  18. foreach ($elements as $element)
  19. {
  20. if (count($element->getTags()))
  21. {
  22. foreach ($element->getTags() as $tag)
  23. {
  24. // Si on a déjà un compteur pour ce tag
  25. if (array_key_exists($tag->getId(), $tags_count))
  26. {
  27. // On incrémente
  28. $tags_count[$tag->getId()] = $tags_count[$tag->getId()] + 1;
  29. }
  30. else
  31. {
  32. // On commence le compteur
  33. $tags_count[$tag->getId()] = 1;
  34. }
  35. }
  36. }
  37. }
  38. // On trie le tableau avec les valeurs décroissantes
  39. // Comme les valeurs sont les count, on aura les tags les plus
  40. // utilisés en haut du tableau
  41. arsort($tags_count);
  42. foreach ($tags_count as $tag_id => $count)
  43. {
  44. $tags_ordered[] = $tag_id;
  45. }
  46. return $tags_ordered;
  47. }
  48. public function getOrderedEntityTagsWithElements($elements)
  49. {
  50. $tag_ordered_reference = $this->getOrderedTagsWithElements($elements);
  51. return $this->populateOrderedReferenceWithElementTags($elements, $tag_ordered_reference);
  52. }
  53. public function populateOrderedReferenceWithElementTags($elements, $ordered_reference)
  54. {
  55. $tags = array();
  56. $tags_ordered = array();
  57. foreach ($elements as $element)
  58. {
  59. if (count($element->getTags()))
  60. {
  61. foreach ($element->getTags() as $tag)
  62. {
  63. $tags[$tag->getId()] = $tag;
  64. }
  65. }
  66. }
  67. foreach ($ordered_reference as $tag_id)
  68. {
  69. $tags_ordered[] = $tags[$tag_id];
  70. }
  71. return $tags_ordered;
  72. }
  73. /**
  74. * Range une liste de tags [0 => Tag] en fonction d'une
  75. * réfèrence sous la forme [0 => tag_id, 1 => tag_id]
  76. *
  77. * @param array $tags
  78. * @param array $reference
  79. * @return array
  80. */
  81. public function sortTagWithOrderedReference($tags, $reference)
  82. {
  83. // tableau des tags rangés
  84. $tag_ordered = array();
  85. // tableau des tags pas encore dans la référence
  86. $tag_not_fond = array();
  87. foreach ($tags as $tag)
  88. {
  89. $position = array_search($tag->getId(), $reference);
  90. // Si on l'a trouvé dans la réference
  91. if ($position !== false)
  92. {
  93. // On le met dans le tableau des tags rangé, avec la clé de la réference
  94. $tag_ordered[$position] = $tag;
  95. }
  96. else
  97. {
  98. // Si il n'étais pas dans la réference on le met en attente dans
  99. // ce tableau
  100. $tag_not_fond[] = $tag;
  101. }
  102. }
  103. // Une fois les tags réferencés dans le tableau ordonné, on ajoute ceux qui
  104. // ne l'était pas
  105. foreach ($tag_not_fond as $tag)
  106. {
  107. $tag_ordered[] = $tag;
  108. }
  109. // On trie le tableau en fonction des clés.
  110. ksort($tag_ordered);
  111. return $tag_ordered;
  112. }
  113. }