X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=application%2FLinkDB.php;h=cd0f29671f9b199c213b4333e8eeab23eedcadb7;hb=4fa9a3c5d83a1024678596a586afe5df14a345b5;hp=f026a0418b98335ae861100968f3104f6f76a7b9;hpb=12266213d098a53c5f005b9afcbbe62771fd580c;p=github%2Fshaarli%2FShaarli.git diff --git a/application/LinkDB.php b/application/LinkDB.php index f026a041..cd0f2967 100644 --- a/application/LinkDB.php +++ b/application/LinkDB.php @@ -289,13 +289,15 @@ You use the community supported version of the original Shaarli project, by Seba return; } + $this->urls = []; + $this->ids = []; $this->links = FileUtils::readFlatDB($this->datastore, []); $toremove = array(); foreach ($this->links as $key => &$link) { if (! $this->loggedIn && $link['private'] != 0) { // Transition for not upgraded databases. - $toremove[] = $key; + unset($this->links[$key]); continue; } @@ -329,14 +331,10 @@ You use the community supported version of the original Shaarli project, by Seba } $link['shorturl'] = smallHash($link['linkdate']); } - } - // If user is not logged in, filter private links. - foreach ($toremove as $offset) { - unset($this->links[$offset]); + $this->urls[$link['url']] = $key; + $this->ids[$link['id']] = $key; } - - $this->reorder(); } /** @@ -346,6 +344,7 @@ You use the community supported version of the original Shaarli project, by Seba */ private function write() { + $this->reorder(); FileUtils::writeFlatDB($this->datastore, $this->links); } @@ -437,15 +436,17 @@ You use the community supported version of the original Shaarli project, by Seba /** * Returns the list tags appearing in the links with the given tags - * @param $filteringTags: tags selecting the links to consider - * @param $visibility: process only all/private/public links - * @return: a tag=>linksCount array + * + * @param array $filteringTags tags selecting the links to consider + * @param string $visibility process only all/private/public links + * + * @return array tag => linksCount */ public function linksCountPerTag($filteringTags = [], $visibility = 'all') { - $links = empty($filteringTags) ? $this->links : $this->filterSearch(['searchtags' => $filteringTags], false, $visibility); - $tags = array(); - $caseMapping = array(); + $links = $this->filterSearch(['searchtags' => $filteringTags], false, $visibility); + $tags = []; + $caseMapping = []; foreach ($links as $link) { foreach (preg_split('/\s+/', $link['tags'], 0, PREG_SPLIT_NO_EMPTY) as $tag) { if (empty($tag)) { @@ -459,8 +460,19 @@ You use the community supported version of the original Shaarli project, by Seba $tags[$caseMapping[strtolower($tag)]]++; } } - // Sort tags by usage (most used tag first) - arsort($tags); + + /* + * Formerly used arsort(), which doesn't define the sort behaviour for equal values. + * Also, this function doesn't produce the same result between PHP 5.6 and 7. + * + * So we now use array_multisort() to sort tags by DESC occurrences, + * then ASC alphabetically for equal values. + * + * @see https://github.com/shaarli/Shaarli/issues/1142 + */ + $keys = array_keys($tags); + $tmpTags = array_combine($keys, $keys); + array_multisort($tags, SORT_DESC, $tmpTags, SORT_ASC, $tags); return $tags; } @@ -528,8 +540,8 @@ You use the community supported version of the original Shaarli project, by Seba return $a['created'] < $b['created'] ? 1 * $order : -1 * $order; }); - $this->urls = array(); - $this->ids = array(); + $this->urls = []; + $this->ids = []; foreach ($this->links as $key => $link) { $this->urls[$link['url']] = $key; $this->ids[$link['id']] = $key;