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;
}
}
$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();
}
/**
*/
private function write()
{
+ $this->reorder();
FileUtils::writeFlatDB($this->datastore, $this->links);
}
/**
* 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)) {
$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;
}
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;