php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 25-05-2008, 03:56
Nixblicker
 Newbie
Links : Onlinestatus : Nixblicker ist offline
Registriert seit: Jul 2004
Beiträge: 4
Nixblicker ist zur Zeit noch ein unbeschriebenes Blatt
Standard vergleichen von Dateiinhalten

Hallo...

Ich bin gerade dabei ein Script zu schreiben, und komme an einer Stelle nicht mehr weiter.
Die Ausgangssituation ist folgende:
Ich habe zwei CVS Dateien.
Die erste ist eine Banliste für einen Gameserver, die eindeutige IDs von Usern enthält die gebannt wurden.
Die zweite Datei, enthält Informationen zu allen Usern, die jemals auf dem Gameserver eingeloggt waren, unter anderem auch die ID.
Ziel ist es nun, die Userliste nach den gebannten IDs zu durchsuchen, und bei übereinstimmung die jeweilige Zeile des Users in eine separate Datei zu speichern.

Ich habe das Script bisher soweit, das ich mir die jeweiligen Dateien vom Server kopiere, und sie anschließend "aufbereite". Das heist, das die ID jeweils an erste Stelle steht, und überflüssige Informationen aus der Liste gefilter werden. Nun kommen die Arrays ins spiel, und da gehts nicht weiter.
Bisher hab ich das so gemacht (ohne Ergebnis):

PHP-Code:
$banlist_content file("$banlist");
$ranklist_content file("$ranklist");

$anzahl_b count($banlist_content);
$anzahl_r count($ranklist_content);

echo 
$anzahl_b//Test (ergibt 14)
echo "<br>";    //Test
echo $anzahl_r//Test (ergibt 1942)
echo "<br>";    //Test

for ($b 0$b $anzahl_b$b++)  //sollte 14mal durchlaufen
  
{
   
$array explode("|",$banlist_content[$b]);  //zeile aufsplitten
     
for ($i 0$i $anzahl_r$i++)                //läuft 1942 mal durch
    
{
      
$array explode("|",$ranklist_content[$i]);  //zeile aufsplitten
     
if ($banlist_content[$b][0] == $ranklist_content[$i][0]) //vergleichen und bei übereinstimmung...
      
{
       echo 
"$ranklist_content[$i][0]|$ranklist_content[$i][1]|<br>\n";  //...ergebnis anzeigen (dürften maximal 14 sein)
}
}

In den Kommentaren steht meine Theorie dazu...

Es sollten eigentlich die ID und der dazugehörige Name ausgegeben werden. Stattdessen bekomme ich nur die ID und den Namen des letzten in der Liste (der noch nicht einmal in der Banliste steht). Und das genau 1942 mal, was der Anzahl der Einträge in der ranklist entspricht.

Geändert von Nixblicker (25-05-2008 um 04:20 Uhr)
Mit Zitat antworten
  #2 (permalink)  
Alt 25-05-2008, 09:39
minou
 Newbie
Links : Onlinestatus : minou ist offline
Registriert seit: May 2008
Beiträge: 27
minou ist zur Zeit noch ein unbeschriebenes Blatt
Smile

Hallo Nixblicker,

du hast einen Fehler in deinem Skript, warum es wahrscheinlich auch nicht geht:

PHP-Code:
$array explode("|",$ranklist_content[$i]);  //zeile aufsplitten
     
if ($banlist_content[$b][0] == $ranklist_content[$i]>>[0]<<
//vergleichen und bei übereinstimmung...
      
{
       echo 
"$ranklist_content[$i][0]|$ranklist_content[$i]>>[1]<<|<br>\n"

Vielleicht behebt das ja dein Problem...

Gruss
Mit Zitat antworten
  #3 (permalink)  
Alt 25-05-2008, 11:12
3DMax
 PHP Senior
Links : Onlinestatus : 3DMax ist offline
Registriert seit: Jan 2004
Beiträge: 1.916
3DMax ist zur Zeit noch ein unbeschriebenes Blatt
Standard Re: vergleichen von Dateiinhalten

Zitat:
Original geschrieben von Nixblicker
PHP-Code:
   $array explode("|",$banlist_content[$b]);  //zeile aufsplitten
     
for ($i 0$i $anzahl_r$i++)                //läuft 1942 mal durch
    
{
      
$array explode("|",$ranklist_content[$i]);  //zeile aufsplitten
     
if ($banlist_content[$b][0] == $ranklist_content[$i][0]) //vergleichen 
1.) beim zweiten $array = explode(.. überschreibst du das erste.
2.) für den vergleich benutzt du diese array überhaupt nicht.
3.) warum benutzt du nicht error_reporting(E_ALL)?
Mit Zitat antworten
  #4 (permalink)  
Alt 25-05-2008, 20:27
Nixblicker
 Newbie
Links : Onlinestatus : Nixblicker ist offline
Registriert seit: Jul 2004
Beiträge: 4
Nixblicker ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hallo 3DMax...

Ich fange mal von Hinten an.
Also da das nur ein Ausschnitt aus dem Code war kannst du das ja nicht wissen, aber ganz am Anfange steht das error_reporting drin. Es zeigt aber keine Fehler mehr an, denn sonst hätte ich das auch mit geschrieben. Erleichtert es doch meistens die Fehlersuche ungemein..

Und zu den Schleifen... ich stehe da total auf dem Schlauch, kannst du das mal anhand des Codes zeigen was du meinst?
Ich lese ja mit "file" die Datei zeilenweise in das Array ein.
Dann lasse ich diese Zeilen Zählen, und lasse die Schleife so oft durchlaufen wie Zeilen vorhanden sind.
Und jedesmal wird eine Zeile der einen Datei, mit allen Zeilen der anderen Datei verglichen, wofür das
$banlist_content[$b][0] == $ranklist_content[$i][0] zuständig ist.
Eigentlich weis ich ja garnicht ob das Explode da überhaupt notwendig ist, spreche ich mit $banlist_content[$b][0] ja doch jedesmal direkt den ersten Datensatz des Arrays an...
Mit Zitat antworten
  #5 (permalink)  
Alt 25-05-2008, 21:41
3DMax
 PHP Senior
Links : Onlinestatus : 3DMax ist offline
Registriert seit: Jan 2004
Beiträge: 1.916
3DMax ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von Nixblicker
Eigentlich weis ich ja garnicht ob das Explode da überhaupt notwendig ist, spreche ich mit $banlist_content[$b][0] ja doch jedesmal direkt den ersten Datensatz des Arrays an...
also file liefert dir ein array mit den einzelnen zeilen, da diese zeilen csv-separierte felder enthalten, musst du natürlich jede zeile auch exploden.

ansonsten liefert dir $banlist_content[$b][0] lediglich das erste zeichen und nicht das erste csv-feld (da dachte ich, gibt es mit error_reporting eine notice, ist aber nicht so).

gib' mal ein kurzes beispiel der beiden csvs dann kann ich dir das schnell machen, weil diese geschachtelte schleife ist nicht gerade effektiv
Mit Zitat antworten
  #6 (permalink)  
Alt 25-05-2008, 22:07
Nixblicker
 Newbie
Links : Onlinestatus : Nixblicker ist offline
Registriert seit: Jul 2004
Beiträge: 4
Nixblicker ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ok... also ein paar Zeilen aus der aufbereiteten Userliste:

PHP-Code:
ID_0:1:1234567|sdfdsfdsf|1211651454|91.39.119.237|
ID_0:0:5842658|sdfthzjzt]|1211587124|84.53.96.37|
ID_0:0:25485425|kljashiruea|1211036177|84.188.109.97|
ID_0:1:524853325|ktjhkjj|1211596265|91.46.108.253

und nun die Banliste:

PHP-Code:
ID_0:1:25487452|banid|0|
ID_0:0:524854269|banid|0|
ID_0:1:125894563|banid|0|
ID_0:1:125684|banid|0
Es müssen also immer nur die ersten Sätze verglichen werden, und bei einer Übereinstimmung, der komplette Datensatz aus der Userliste gespeichert werden.
Das ganze funktioniert wie ne Art Telefonbuchliste. Ich hab ne Liste mit Telefonnummern, und eine andere mit kompletten Adressdaten, zuzüglich der Nummer. Ziel ist es, zu den gesuchten Nummern, die Adresse zu haben... Ich glaube, das ist einigermaßen verständlich erklärt

Das Buchstabengewirre sind die Namen, und am Anfang steht immer die ID.. Ich habe auch grade noch gemerkt, das ich beim aufbereiten die Möglichkeit in Betracht ziehen muss, das einer im Namen so nen Separator (|) hat...
Mit Zitat antworten
  #7 (permalink)  
Alt 25-05-2008, 22:48
3DMax
 PHP Senior
Links : Onlinestatus : 3DMax ist offline
Registriert seit: Jan 2004
Beiträge: 1.916
3DMax ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von Nixblicker
Das ganze funktioniert wie ne Art Telefonbuchliste. Ich hab ne Liste mit Telefonnummern, und eine andere mit kompletten Adressdaten, zuzüglich der Nummer. Ziel ist es, zu den gesuchten Nummern, die Adresse zu haben... Ich glaube, das ist einigermaßen verständlich erklärt
ja, das war mir schon klar
wobei, es vielleicht empfehlenswert wäre, diese csv-dateien in einer datenbank zu verwalten.

müsste so hinhauen (obwohl fgetscv() irgendwie buggy ist - ist mir schonmal aufgefallen)
PHP-Code:
// CSV-Dateien zum Auslesen
$banlist_file 'banlist.csv';
$ranklist_file 'ranklist.csv';


// Liest die übergebene CSV-Datei aus und gibt ein Array
// mit der UID (erstes CSV-Feld) als KEY und den geamten Feldern
// als VALUE zurück
function loadCsv($file)
{
 
$csv = array();

 if(!
is_resource($fp fopen($file'r')))
 {
  die(
"Kann CSV '{$file}' nicht öffnen");
 }

 while(
is_array($fields fgetcsv($fp4096'|''"')))
 {
  
$csv[$fields[0]] = $fields;
 }

 return 
$csv;
}

// Alle Datzensätze aus der Rank-Liste ermitteln, die in der Ban-List enthalten sind
$matches array_intersect_key(loadCsv($ranklist_file), loadCsv($banlist_file));

// Zum Test mal ausgeben lassen
echo '<pre>'.htmlentities(print_r($matchestrue)).'</pre>'
Zitat:
Original geschrieben von Nixblicker
Ich habe auch grade noch gemerkt, das ich beim aufbereiten die Möglichkeit in Betracht ziehen muss, das einer im Namen so nen Separator (|) hat...
ja, diese felder müssten dann mit " eingeschlossen werden und ", falls die auch vorkommen dürfen, im feld wiederum escaped werden.
dafür hat php allerdings keine funktion
Mit Zitat antworten
  #8 (permalink)  
Alt 02-06-2008, 23:25
Nixblicker
 Newbie
Links : Onlinestatus : Nixblicker ist offline
Registriert seit: Jul 2004
Beiträge: 4
Nixblicker ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Tut mir leid das ich mich so lange nicht gemeldet habe. Ich bin aber nicht so unhöflich , mich nicht für die Hilfe zu bedanken...
Ich hatte nur im RL ne menge zu tun...

Deine Lösung funktioniert super, und ich habs jetzt auch geschafft, das Problem mit den "|" im Namen zu umgehen. Ich wandle diese Zeichen (wenn sie vorkommen) beim konvertieren der Files um, und beim Anzeigen der Liste wieder zurück.
Der Rest ist jetzt nur noch Fleißarbeit...

Also nochmal vielen Dank für deine sehr sehr große Hilfe

Geändert von Nixblicker (02-06-2008 um 23:27 Uhr)
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

ADSMAN V3 - Werbe-Manager ansehen ADSMAN V3 - Werbe-Manager

ADSMAN V3 - mehr als nur ein Bannermanager! Banner, Textanzeigen und PagePeel Manager! Mit ADSMAN PRO haben Sie die Marketinglösung für eine effektive und effiziente Werbeschaltung mit messbaren Ergebnissen. Unterstützt werden Bannerformate in beliebi

25.10.2018 virtualsystem | Kategorie: PHP/ Bannerverwaltung
PHP News und Artikel Script V2

News schreiben, verwalten, veröffentlichen. Dies ist jetzt mit dem neuen PHP News & Artikel System von virtualsystem.de noch einfacher. Die integrierte Multi-User-Funktion und der WYSIWYG-Editor (MS-Office ähnliche Bedienung) ermöglichen...

25.10.2018 virtualsystem | Kategorie: PHP/ News
Top-Side Guestbook

Gästebuch auf Textbasis (kein MySQL nötig) mit Smilies, Ip Sperre (Zeit selbst einstellbar), Spamschutz, Captcha (Code-Eingabe), BB-Code, Hitcounter, Löschfunktion, Editierfunktion, Kommentarfunktion, Kürzung langer Wörter, Seiten- bzw. Blätterfunktion, V

22.10.2018 webmaster10 | Kategorie: PHP/ Gaestebuch
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 05:38 Uhr.