PHP Klick-Counter: Ausgabe nach Klicks sortieren.

Belee

Lt. Commander
Registriert
Dez. 2006
Beiträge
1.518
Hallo

Bin an einem Klick-Counter für eine Linkliste dran, jetzt stehe ich vor einem Problem und zwar, wie kann ich die Ausgaben "Textdatei" - sieht so aus...

HTML:
link1|100|name
link2|232|name
link3|37|name
link4|164|name
usw.
URL|Klicks|Name

Nach Klicks "absteigend" sortieren? hat da jemand eine Funktion oder Snippet für mich die ich dann in das Script einbauen kann? oder Tipp wie sowas gemacht wird?

Danke.
 
Zuletzt bearbeitet:
Erstmal die Datei in ein (mehrdimensionales) Array einlesen. Dann sortieren.
Dafür kannst du http://php.net/manual/de/function.usort.php benutzen. Dieser Funktion übergibst du den Namen einen selbstgeschriebenen Funktion, die zwei ihr übergebene Parameter vergleicht und zurückgibt, welcher "größer" ist. usort sortiert dann das Array entsprechend.
 
Hab da jetzt was gebastellt jedoch stimmt was nicht, es wird nicht sortiert, müsste aber eigentlich.

Hier das Script zum sortieren:

PHP:
function get_links($limit = -1)
  {
    $return = array();
  $fp = fopen("links.txt","r");
  if ($fp)
  {
   $i = 0;
   while(!feof($fp) && $i < $limit || !feof($fp) && $limit == -1)
   {
    $content = fgets($fp);
    $content = preg_replace("/\r|\n/s", "", $content);
    $_link_data = explode('|', $content);
    if (isset($_link_data[2]) && isset($_link_data[1]))
    {
      $link_data['content'] = $_link_data[0];
      $link_data['clicks'] = $_link_data[1];
      $link_data['name'] = $_link_data[2];
      if (!empty($link_data['name']))
      {
        $return[$i] = array($link_data);
        $i++;
      }
    }
   }
  fclose($fp);
  }
  else
 
     echo "Fehler";
 
  return $return;
  }
 
 
$links = get_links();
  $content = "";
 
// Vergleich
 
    function cmp($a, $b) {
      if ($a == $b) {
         return 0;
     }
     return ($a > $b) ? -1 : 1;
    }
 
    // Sortieren und Ausgabe
 
uasort($links, 'cmp');
  foreach ($links as $key => $link) {
      $content .= $links[$key][0]['content']."|".$links[$key][0]['clicks']."|".$links[$key][0]['name']."\n";
    }
  $fp = fopen("links.txt","w+");
  fwrite($fp, $content);
    fclose($fp);

Wo ist der Wurm, kann ihn nicht finden.

Edit:
Fast vergessen...und hiermit wollte ich die Links mit den meisten Klicks anzeigen...

PHP:
include_once ('links.php');
$links_data = get_links(10);
$i = 0;
while($i < count($links_data))
{
  echo ($i+1).".<a href=\"redirect.php?name=".$links_data[$i][0]['name']."\">".$links_data[$i][0]['name']."</a>(".$links_data[$i][0]['clicks']." Klicks)<br />";
  $i++;
}
 
Zuletzt bearbeitet:
Deine Vergleichsfunktion passt nicht, der Rest schaut aber beim Überfliegen gut aus!

Du hast folgendes Array:
PHP:
$array = array(
0 => array(array('content' => 'link1', 'clicks' => '100')),
1 => array(array('content' => 'link2', 'clicks' => '232')),
usw...);
(Wieso packst du 2 Arrays ineinander?)

Wenn nun die usort (wieso nimmst du uasort?) anfängt zu sortieren, wird deine cmp Funktion mit zwei Parametern aufgerufen.
Bei oben genanntem Array schauen die Parameter folgendermaßen aus:
PHP:
$a =  array(array('content' => 'link1', 'clicks' => '100'));
$b =  array(array('content' => 'link2', 'clicks' => '232'));

Du musst also folgendermaßen vergleichen:
PHP:
function cmp($a, $b) {
    $clicksA = (int)$a[0]['clicks'];
    $clicksB = (int)$b[0]['clicks'];
    if ($clicksA  == $clicksB) {
        return 0;
    }
    return ($clicksA > $clicksB) ? -1 : 1;
}

So sollte es dann funktionieren.

PS: Ein Tipp noch: Mit der file() Funktion kannst du ganz schnell eine Datei zeilenweise einlesen und dann mit einer for-Schleife weiterverarbeiten. Ist ein wenig kürzer und übersichtlicher im Quelltext.
 
Hey danke, da war also der Wurm. Wenn ich aber dein Posting lese dann scheint mir das dass Script trotzdem noch nicht optimal, wobei ich jetzt auch nicht wüsste wie ich das besser machen kann :(
Das mit dem arrays, ich bin die ganze Zeit schon am überlegen warum ich das so gemacht habe, irgend etwas war da wo ich ein Problem hatte und mit 2 arrays war das Problem dann weg, ich komme jetzt zum verrecken nicht darauf. Bin hier ständig an paar Sachen dran...ist Mist wenn man alles alleine machen muss :D

Wie meinst du das mit file? im Zusammenspiel mit array_map?
 
Genau, array_map wär auch ne elegante Möglichkeit:
PHP:
function processLinks($line) {
    $line = trim($line);
    $line = explode('|', $line);
    return array('clicks'  => (int)$line[1]
                 'content' => $line[0], usw..);
}
function cmpClicks($a, $b) {
    return $a['clicks'] - $b['clicks'];
}

$limit = 10; //Die 10 Links mit der größten Klickzahl, 0 für alle Links.

$linksRaw = file('pfad/zur/datei');

$links = array_map('processLinks', $linksRaw);
usort($links, cmpClicks);

if($limit) {
    $links = array_slice($links, 0, $limit);
}

//Hier dann ausgeben oder in Datei schreiben (mit implode :D)
Habs nicht getestet, sollte aber funktionieren. ;)
 

Ähnliche Themen

Zurück
Oben