aboutsummaryrefslogtreecommitdiffhomepage
path: root/application
diff options
context:
space:
mode:
authorArthurHoaro <arthur@hoa.ro>2018-05-29 20:52:30 +0200
committerArthurHoaro <arthur@hoa.ro>2018-05-29 20:52:30 +0200
commitf8c5660df82432c7f3bb0686e393db5a2b46eeb5 (patch)
tree7cef356fd0f5e18000c4266890b4cdde0249230b /application
parentf28396a2f82fe61af05f19c1df367f4c660655ab (diff)
downloadShaarli-f8c5660df82432c7f3bb0686e393db5a2b46eeb5.tar.gz
Shaarli-f8c5660df82432c7f3bb0686e393db5a2b46eeb5.tar.zst
Shaarli-f8c5660df82432c7f3bb0686e393db5a2b46eeb5.zip
Tag sort - UT + comment + fix filter and visibility
Before this, linksCountPerTag call without would have ignored visibility parameter
Diffstat (limited to 'application')
-rw-r--r--application/LinkDB.php25
1 files changed, 18 insertions, 7 deletions
diff --git a/application/LinkDB.php b/application/LinkDB.php
index ce53f200..cd0f2967 100644
--- a/application/LinkDB.php
+++ b/application/LinkDB.php
@@ -436,15 +436,17 @@ You use the community supported version of the original Shaarli project, by Seba
436 436
437 /** 437 /**
438 * Returns the list tags appearing in the links with the given tags 438 * Returns the list tags appearing in the links with the given tags
439 * @param $filteringTags: tags selecting the links to consider 439 *
440 * @param $visibility: process only all/private/public links 440 * @param array $filteringTags tags selecting the links to consider
441 * @return: a tag=>linksCount array 441 * @param string $visibility process only all/private/public links
442 *
443 * @return array tag => linksCount
442 */ 444 */
443 public function linksCountPerTag($filteringTags = [], $visibility = 'all') 445 public function linksCountPerTag($filteringTags = [], $visibility = 'all')
444 { 446 {
445 $links = empty($filteringTags) ? $this->links : $this->filterSearch(['searchtags' => $filteringTags], false, $visibility); 447 $links = $this->filterSearch(['searchtags' => $filteringTags], false, $visibility);
446 $tags = array(); 448 $tags = [];
447 $caseMapping = array(); 449 $caseMapping = [];
448 foreach ($links as $link) { 450 foreach ($links as $link) {
449 foreach (preg_split('/\s+/', $link['tags'], 0, PREG_SPLIT_NO_EMPTY) as $tag) { 451 foreach (preg_split('/\s+/', $link['tags'], 0, PREG_SPLIT_NO_EMPTY) as $tag) {
450 if (empty($tag)) { 452 if (empty($tag)) {
@@ -458,9 +460,18 @@ You use the community supported version of the original Shaarli project, by Seba
458 $tags[$caseMapping[strtolower($tag)]]++; 460 $tags[$caseMapping[strtolower($tag)]]++;
459 } 461 }
460 } 462 }
463
464 /*
465 * Formerly used arsort(), which doesn't define the sort behaviour for equal values.
466 * Also, this function doesn't produce the same result between PHP 5.6 and 7.
467 *
468 * So we now use array_multisort() to sort tags by DESC occurrences,
469 * then ASC alphabetically for equal values.
470 *
471 * @see https://github.com/shaarli/Shaarli/issues/1142
472 */
461 $keys = array_keys($tags); 473 $keys = array_keys($tags);
462 $tmpTags = array_combine($keys, $keys); 474 $tmpTags = array_combine($keys, $keys);
463 // We sort tags by DESC occurrences, then ASC alphabetically for equal values.
464 array_multisort($tags, SORT_DESC, $tmpTags, SORT_ASC, $tags); 475 array_multisort($tags, SORT_DESC, $tmpTags, SORT_ASC, $tags);
465 return $tags; 476 return $tags;
466 } 477 }