Hannibal: Arrays durchsuchen

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

  1. 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

    1. 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

      1. 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

        1. 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

          1. 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

            1. Hallo zusammen

              Vielen Dank für eure Tipps.
              Die könnten mir helfen.

              Freundliche Grüsse aus Winterthur
              Hannibal

      2. 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;

        Datenfile auslesen

        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!