PHP Regex Optimierungen oder Verbesserungen

cpujunkie

Cadet 3rd Year
Registriert
Dez. 2011
Beiträge
53
Hallo Leute,

ich bin noch nicht so der tollste, wenn es um programmieren mit PHP geht, aber es wird langsam besser und der rekursive Gedanke kommt auch etwas mehr durch. Ich hatte ein ähnliches Beispiel schon vor knapp 6 Monaten gepostet, da ich damals noch gar keine Ahnung hatte.

Zu meinem Problem: Ich habe eine semiprofessionelle Lasertag Ausrüstung erworben mit 4 Westen und Software, die die Treffer elektronisch tracken. Allerdings ist das normale Ausgabeprogramm sehr schlecht, so dass ich einen schönen neuen Scoremonitor per PHP programmieren möchte.

Die Ausrüstung erzeugt ein Txt File, welches viele Informationen erhält, hier ein Beispiel

Code:
# Hier werden Spielernamen und Spielerfarbe festgeleg, erste Zeile heisst soviel wie Plyr 01 heisst Plyr 01 und ist Farbe 2
Plyr 01,Plyr 01,2,0
Plyr 02,Plyr 02,2,0
Plyr 03,Plyr 03,2,0
Plyr 04,Plyr 04,2,0
Plyr 05,Plyr 05,2,0
Plyr 06,Plyr 06,1,0
Plyr 07,Plyr 07,1,0
Plyr 08,Plyr 08,1,0
Plyr 09,Plyr 09,1,0
Plyr 10,Plyr 10,1,0

# Trefferprotokoll, erste Zeile heisst, dass Spieler 10 Spieler 1 getroffen hat
Plyr 10,5,6,Plyr 01,4,5,22:11:27
Plyr 10,5,6,Plyr 01,4,5,22:11:27
Plyr 06,5,4,Plyr 03,4,1,22:11:36
Plyr 07,5,6,Plyr 04,5,1,22:11:36
Plyr 10,5,18,Plyr 04,4,1,22:11:45
Plyr 10,5,18,Plyr 05,4,7,22:11:45
Plyr 06,5,8,Plyr 05,4,7,22:11:45
Plyr 10,5,26,Plyr 01,2,6,22:11:52
Plyr 10,5,26,Plyr 02,4,1,22:11:53
Plyr 06,5,8,Plyr 01,5,6,22:12:01
Plyr 10,5,29,Plyr 04,2,3,22:12:01
Plyr 05,3,7,Plyr 06,4,11,22:12:02
Plyr 07,5,11,Plyr 02,3,1,22:12:09
Plyr 05,3,23,Plyr 10,4,35,22:12:11
Plyr 09,5,4,Plyr 02,5,1,22:12:18
Plyr 10,4,35,Plyr 03,4,16,22:12:18
Plyr 03,4,16,Plyr 09,4,5,22:12:19
Plyr 04,5,15,Plyr 10,3,52,22:12:28


Shots Fired Data:

Plyr 01,341
Plyr 02,381
Plyr 03,286
Plyr 04,420
Plyr 05,438
Plyr 06,17
Plyr 07,366
Plyr 08,510
Plyr 09,418
Plyr 10,372

Dazu habe ich folgendes in PHP geschrieben, was auch schon ganz gut funktioniert
Code:
<?PHP
$text = file_get_contents('gameres.txt');  ### Ergebnistextfile import
$downs01 = preg_match_all("/,Plyr 01,.,\d+,..:/", $text, $match00);  ### Sucht nach Muster und Anzahl für "Wurde getroffen"
$hits01 = preg_match_all("/Plyr 01,.,\d+,P/", $text, $match01); ### Sucht nach Muster und Anzahl "Hat getroffen"
$score01 = $hits01 * 3 - $downs01;  ### Es gibt drei Punkte pro Treffer und ein Punkt Abzug, wenn man getroffen wird
$ratio01 = $hits01 / $downs01;  ### Verhältnis Berechnung

$shotsfired = preg_split("/Shots Fired Data:/", $text); ### Teil $text in zwei Arrays
$text2 = $shotsfired[1];  ### Speichert zweiten Eintrag aus Ergebnis Array in neuen String
$final = preg_split("/Plyr..../", $text2);  ### Hier werd ein Array angelegt mit "Schuss abegeben" (Arraynummer = Spielernummer)
$shot01 = round($hits01 / $final[2] * 100, 1);  ### Teilt die Hits durch Schuss abegeben für die prozentuale Trefferchance
echo "Player 01 |  $score01  |||   $hits01 | $downs01    |  $shot01% "; ### Ausgabe der Punkte etc.
?>

Das kann ich natürlich für jeden Spieler wiederholen und habe schon eine schöne Liste mit allen Spielern.

Ich frage mich nun aber: Wie kann ich eventuell die Spieler nach Punktestand sortieren, so dass ich den besten als ersten ausgebe, also dieser quasi oben steht. Auch habe ich noch keine Lösung wie ich einem Spieler eine Farbe zuweisen kann.

Ich denke um diese Dinge noch mit aufzunehmen müsste ich komplett anders an die Sache rangehen, eventuell jeden Spieler als Array oder so speichern, aber ich hab einfach keine Idee... Wie gesagt, bin mit PHP und Programmieren noch sehr am Anfang... Freue mich über Anmerkungen und Vorschläge :p
 
1. Named Capturing Groups verwenden - erhöht die Übersicht immens!

Mal separiert, Namen kannst du ja ändern.
Code:
(?<index>.*?),(?<name>.*?),(?<farbe>\d+),(?<test>\d+)
(?<src_player>.*?),(?<src_test1>\d+),(?<src_test2>\d+),(?<dest_player>.*?),(?<dest_test1>\d+),(?<dest_test2>\d+),(?<zeit>(?<stunde>\d+):(?<minute>\d+):(?<sekunde>\d+))
(?<player>.*?),(?<shots>\d+)
Im Beispiel 1 hättest du dann folgenden Output (gekürzt):
Code:
array (size=9)
  0 => 
    array (size=2)
      0 => string 'Plyr 01,Plyr 01,2,0' (length=19)
      1 => string 'Plyr 02,Plyr 02,2,0' (length=19)
  'index' => 
    array (size=2)
      0 => string 'Plyr 01' (length=7)
      1 => string 'Plyr 02' (length=7)
  1 => 
    array (size=2)
      0 => string 'Plyr 01' (length=7)
      1 => string 'Plyr 02' (length=7)
  'name' => 
    array (size=2)
      0 => string 'Plyr 01' (length=7)
      1 => string 'Plyr 02' (length=7)
  2 => 
    array (size=2)
      0 => string 'Plyr 01' (length=7)
      1 => string 'Plyr 02' (length=7)
  'farbe' => 
    array (size=2)
      0 => string '2' (length=1)
      1 => string '2' (length=1)
  3 => 
    array (size=2)
      0 => string '2' (length=1)
      1 => string '2' (length=1)
  'test' => 
    array (size=2)
      0 => string '0' (length=1)
      1 => string '0' (length=1)
  4 => 
    array (size=2)
      0 => string '0' (length=1)
      1 => string '0' (length=1)
Wenn das alles in einer Datei steht, dann entsprechend mit ^ und $ arbeiten, damit die Zeilanfänge und -enden korrekt erkannt werden (beträfe hier ja dann Auszüge zwei und drei wo String,Zahl steht).

2. Eigene Tabelle aufstellen. Spontan würde mir da ein
Code:
$data = [
	$Spieler1 = [
		HitsTotal = 123,
		Color = 1,
		Hits = [
			$GetroffenerSpieler1 = [
				"12:34:56",
				"12:34:57",
				"12:34:58"
			],
			$GetroffenerSpieler2 = [...],
			$GetroffenerSpieler3 = [...],
			...
		]
	],
	$Spieler2 = [...],
	$Spieler3 = [...],
	...
];
einfallen. Mal als Array dargestellt, falls du noch nicht mit Klassen umgehen kannst.

Sortieren kannst du die Daten dann mit usort. Der Callback wäre dann
Code:
function( $a, $b )
{
	$a = $a["HitsTotal"];
	$b = $b["HitsTotal"];
	return $a == $b
		? 0
		: (
			$a > $b
				? 1
				: -1
		);
}
(auf- oder absteigend geht dann einfach via Vorzeichen)

3. Bester Weg: Daten auslesen, in eine Datenbank packen und dann daraus die Werte ziehen, inkl. einfacher, korrekter Sortierung. Der Weg, die Sortierung über die DB zu machen ist bedeutend einfacher, zumal du auch einfach mehrere Sortierungen angeben kannst, Gruppierungen usw. Außerdem ist das bedeutend schneller.

Falls du erstmal bei Flat-Files bleiben willst, kannst du die Daten für die spätere Verwendung ggf. via serialize und unserialize gleich im richtigen Format zwischenspeichern ohne erneut alle Dateien parsen zu müssen.
 
Wow, vielen Dank... Ich denke, deinen Beitrag muss ich erstmal studieren :)
 
Zurück
Oben