diff options
author | ArthurHoaro <arthur@hoa.ro> | 2018-06-04 18:34:50 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-06-04 18:34:50 +0200 |
commit | 17e45b2e9c33c736751e059276fadb480f98e621 (patch) | |
tree | 5160e3f04c570ca63ff2645d63f31934f70efeb7 /application | |
parent | d9cd27322a97e6ed3a8b11a380ef0080e3baf79c (diff) | |
parent | f8c5660df82432c7f3bb0686e393db5a2b46eeb5 (diff) | |
download | Shaarli-17e45b2e9c33c736751e059276fadb480f98e621.tar.gz Shaarli-17e45b2e9c33c736751e059276fadb480f98e621.tar.zst Shaarli-17e45b2e9c33c736751e059276fadb480f98e621.zip |
Merge pull request #1143 from ArthurHoaro/sort-equal-tags
Fix order of tags with the same number of occurrences
Diffstat (limited to 'application')
-rw-r--r-- | application/LinkDB.php | 29 |
1 files changed, 21 insertions, 8 deletions
diff --git a/application/LinkDB.php b/application/LinkDB.php index c1661d52..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,8 +460,19 @@ 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 | } |
461 | // Sort tags by usage (most used tag first) | 463 | |
462 | arsort($tags); | 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 | */ | ||
473 | $keys = array_keys($tags); | ||
474 | $tmpTags = array_combine($keys, $keys); | ||
475 | array_multisort($tags, SORT_DESC, $tmpTags, SORT_ASC, $tags); | ||
463 | return $tags; | 476 | return $tags; |
464 | } | 477 | } |
465 | 478 | ||