Arrays durchsuchen
Hannibal
- php
Hallo zusammen
Ich habe ein Frage.
Gibt es in PHP einen Befehl, mit dem man alle Arrays miteinander vergleichen kann und danach die gleichen rauslöschen.
Ich habe ein Script geschrieben, dass zuerst den ersten Array nimmt, mit allen Arrays vergleicht und alle gleichen rauslöscht.
Danach wird der zweite Array genommen, usw.
Braucht aber für nur 5 Arrays mit allen vergleichen ca. 15 Sek.
Und das bei Logdateien.
Könnt ihr mir helfen.
Sinn meiner Sache:
Ich möchte Log-Dateien auslesen und einen Zähler erstellen.
Da dieser möglichst schnell rauf muss, mach ich es ganz einfach.
Ich vergleiche alle IP-Adressen und lösche die selben raus.
Danach zähle ich zusammen, wie viele IP es noch sind=Zugriffe
Ich weiss, dass dies eine schlechte Idee ist, aber ich habe nicht Zeit für mehr.
Ich muss meine Website möglichst schnell aufschalten und daher eine schnelle Lösung.
Später werde ich den Zähler dann ausbessern.
Dadurch gehen keine Besuche verloren, ich kann nur mehr bekommen.
Vielen Dank im Voraus für eure Hilfe
Gruss aus Winterthur(CH)
Hannibal
hi,
Gibt es in PHP einen Befehl, mit dem man alle Arrays miteinander vergleichen kann und danach die gleichen rauslöschen.
dafür solltest du dir die übersichtsseite zu den array-funktionen im manual ansehen, http://de.php.net/manual/de/ref.array.php.
Ich möchte Log-Dateien auslesen und einen Zähler erstellen.
Da dieser möglichst schnell rauf muss, mach ich es ganz einfach.
Ich vergleiche alle IP-Adressen und lösche die selben raus.
Danach zähle ich zusammen, wie viele IP es noch sind=Zugriffe
warum brauchst du dafür _mehrere_ arrays, wenn es sich doch offenbar nur um daten gleichen typs (IP-adressen) handelt?
gruss,
wahsaga
Hallo
dafür solltest du dir die übersichtsseite zu den array-funktionen im manual ansehen, http://de.php.net/manual/de/ref.array.php.
Danke für den Typ.
Dort habe ich zwar schon etwas geschaut, aber ich werde nochmals schauen.
warum brauchst du dafür _mehrere_ arrays, wenn es sich doch offenbar nur um daten gleichen typs (IP-adressen) handelt?
Was dann?
Hier mein Quelltext(prints sind nur zur überprüfung da:
$log = fopen("logs/access_log","r");
$Array_Zahl=0;
while(!feof($log))
{
$Zeile = fgets($log);
$inhalt = explode(" -", $Zeile);
$IP[$Array_Zahl]=$inhalt[0];
$Array_Zahl++;
}
fclose($log);
$Array_Zahl1=$Array_Zahl;
$Startzahl=0;
for($a=0;$a<$Array_Zahl1;$a++)
{
print("<br>".$Startzahl."<br>");
$aktuell=1;
for($i=0;$i<$Array_Zahl1;$i++)
{
print($IP[$Startzahl]."<br>".$IP[$aktuell]."<br>nach ersetzten<br>");
if($IP[$Startzahl]==$IP[$aktuell])
{
array_merge($IP[$Startzahl],$IP[$aktuell]);//Führt zwei oder mehr Arrays zusammen
}
print($IP[$Startzahl]."<br>".$IP[$aktuell]."<br><br>");
$aktuell++;
}
$Startzahl++;
print("<br><br><br><br>hier ".$Startzahl." Runde von ".$Array_Zahl."<br><br><br><br><br><br><br><br>");
}
gruss,
wahsaga
Gruss Hannibal
hi,
array_merge($IP[$Startzahl],$IP[$aktuell]);//Führt zwei oder mehr Arrays zusammen
hmm, wenn ich recht verstehe, führst du hier also sowieso schon alle IPs in einem array zusammen?
ich würde einfach _alle_ IPs in ein array packen (sofern der speicher bei der anzahl mitspielt), und dann da anschliessend array_unique() drüber laufen lassen, um doppelte einträge rauszukegeln ...
[link.http://de.php.net/manual/de/function.array-unique.php]
gruss,
wahsaga
Hello,
ich würde einfach _alle_ IPs in ein array packen (sofern der speicher bei der anzahl mitspielt), und dann da anschliessend array_unique() drüber laufen lassen, um doppelte einträge rauszukegeln ...
Hallo,
ich würde einfach die IPs als Index benutzen und den Wert dahinter incrementieren.
Das nennt man dann direkt gestreuten Index *gg*
$ip = ip2long($IP);
$anzahl[$ip]++;
Zur Not kann man die IP vorher noch in Dezimalschreibweise umwandeln.
Grüße
Tom
hi,
ich würde einfach die IPs als Index benutzen und den Wert dahinter incrementieren.
ja, ist mir nachher auch noch eingefallen.
einfach kleine abfrage, gibt es schon ein array-element mit dem index 'IP' - wenn ja, einfach wert um eins erhöhen, wenn nein, array-element mit startwert 1 anlegen.
gruss,
wahsaga
Hallo zusammen
Vielen Dank für eure Tipps.
Die könnten mir helfen.
Freundliche Grüsse aus Winterthur
Hannibal
Hallo! Nur mal ein Test:
Versuch mal, habs noch nicht gecheckt!
Hier wird jede IP nur einmal gelistet und hintendran immer ne neue Zahl geschrieben:
102384639|2
412378341|1
354673567|3
Jetzt mußt Du die Zahlen am Ende nur noch zusammenzählen!
Check it....
$log_exp="$REMOTE_ADDR";
$zeilen = file("log_File.txt");
$anz_zeilen = sizeof($zeilen);
$x=0;
for ($i=0; $i<$anz_zeilen; $i++) {
list ($log_word, $log_num) = split("\|", chop($zeilen[$i]));
// wenn IP gefunden wird
if ($log_exp==$log_word) {
$log_num++;
$i-2;
$x++;
}
$new_log .= "$log_word|$log_num\n";
}
// wenn die IP nicht schon geloggt wurde
if ($x==0) {
$log_num = "1";
$new_log .= "$log_exp|$log_num\n";
}
$data = fopen("log_File.txt","w+");
flock($data,1);
fwrite($data, $new_log);
flock($data,3);
fclose($data);
unset($new_log);
Viel Spass damit!
So funzt zumindest mein logfile!
Gute Nacht!