Classement d'informations (fichier .log) dans un tableau

sn2GhostKiller
Invité n'ayant pas de compte PHPfrance

19 juil. 2014, 09:10

Salut,
D'accord Wolan, je m'en tiendrai à file, merci ! Maitenant que tu le mentionnes, il est vrai que j'ai aperçu la fonction fgets lorsque je cherchais de la documentation su fopen, je ne pensais pas que ces fonctions devaient être utilisées ensembles, du moins pour ce que je cherche à réaliser. Merci encore ! :)

sn2GhostKiller
Invité n'ayant pas de compte PHPfrance

19 juil. 2014, 09:12

D'accord, je m'en tiendrais donc à file. Merci Wolan ! :D

sn2GhostKiller
Invité n'ayant pas de compte PHPfrance

19 juil. 2014, 09:14

Désolé, j'ai cru que le premier message n'était pas partie (la page de confirmation d'envoi ne s'était pas affichée, connexion instable...).

sn2GhostKiller
Invité n'ayant pas de compte PHPfrance

19 juil. 2014, 10:13

Salut, maintenant, j'essaie de faire un $pattern variable. En fait, le problème c'est que la syntaxe des lignes du fichier log varie, par exemple :
> Quand quelqu'un tue quelqu'un d'autre, et donc marque un point :
L 07/15/2014 - 19:39:32: "gK.sn2<2><STEAM_1:1:84443486><CT>" [108 567 236] killed "Wayne<7><BOT><TERRORIST>" [-19 436 48] with "awp"
> Quand quelqu'un arrive dans la partie :
L 07/15/2014 - 19:39:10: "gK.sn2<2><STEAM_1:1:84443486><>" entered the game
> Quand quelqu'un achète une arme :
L 07/15/2014 - 19:39:20: "gK.sn2<2><STEAM_1:1:84443486><CT>" purchased "awp"
Le problème, c'est que je ne peux pas utiliser le même $pattern pour toute les lignes car je ne récupère pas la totalité des informations de chaques lignes, par exemple, concernant la ligne où quelqu'un marque un point, les informations qui entrent dans le tableau sont seulement la date, l'heure et le nom de joueur, mais si j'adapte le $pattern en fonction de cette action, alors la syntaxe des autres les lignes décrivant une action différente ne seront plus adaptées.
Alors j'essaie de faire varier la configuration de mon $pattern en fonction du contenu de la ligne :
<?php
$log = file("test.log");
foreach ($log as $lineNumber => $lineContent)
{
if(preg_match("#killed#",$lineContent){
(puis le preg_match approprié)
Mais à l'execution, il y a un message qui ne concerne pas le preg_match en premier lieu :
"Parse error: syntaxe error unexpected '{' ..."
donc j'enlève l'accolade, mais il y a encore une erreur :
"Parse error: syntaxe error unexpected '$pattern' (T_VARIABLE) in ...."
Si ma méthode est tout simplement fausse, pouvez-vous me donner une astuce afin que je puisse faire varier les paramètres de la fonction preg_match en fonction du contenu d'une ligne ?
Merci d'avance.

Eléphanteau du PHP | 25 Messages

19 juil. 2014, 14:12

Bonjour,

Il n'y a pas une accolade en trop il manque une parenthèse à la fin de ta condition, avant l'accolade.
<?php
$log = file("test.log");
foreach ($log as $lineNumber => $lineContent)
{
if(preg_match("#killed#",$lineContent)){
Pense à utiliser la balise php dans tes messages pour que le code soit plus facile à lire.

Je ferais plutôt un seul pattern pour toutes les lignes que de faire plusieurs patterns.

Bonne journée.

sn2GhostKiller
Invité n'ayant pas de compte PHPfrance

19 juil. 2014, 15:57

Bonjour,
Effectivement, que de bêtise... Et je penserais à utiliser les balises dans mes prochains messages.

sn2GhostKiller
Invité n'ayant pas de compte PHPfrance

19 juil. 2014, 19:59

Bonjour !
J'ai réussi à classer toutes les informations utiles dans un tableau ! Voici le résultat (ou plutôt une partie du résultat) :
Array ( [0] => L 07/15/2014 - 19:39:35: "Wayne<7>" purchased "m4a1" [1] => 07/15/2014 [2] => 19:39:35 [3] => Wayne<7> [4] => purchased [5] => m4a1 )
Array ( [0] => L 07/15/2014 - 19:39:41: "Chet<4>" [442 1350 -16] killed "Vladimir<11>" [413 1085 48] with "ak47" [1] => 07/15/2014 [2] => 19:39:41 [3] => Chet<4> [4] => killed [5] => Vladimir<11> [6] => with [7] => ak47 ) Array ( [0] => L 07/15/2014 - 19:39:41: "Chet<4>" [442 1350 -16] killed "Vladimir<11>" [413 1085 48] with "ak47" (headshot) [1] => 07/15/2014 [2] => 19:39:41 [3] => Chet<4> [4] => killed [5] => Vladimir<11> [6] => with [7] => ak47 [8] => (headshot) )
Voici le programme, ou du moins la partie PHP :
<?php
$log = file("test.log");
	foreach($log as $statInfo)
		{
			$patternHeadshot = '#L ([0-9/]{10}) - ([0-9:]{8}): "([\s\S]*?)(?:<STEAM[\s\S]>*)?" (?:\[\d* \d* \-*\d*\]) (\w*) "([\s\S]*)" (?:\[\d* \d* \-*\d*\]) (\w+) "(\d*\w*)" (\(\w*\))#';
			$patternKills = '#L ([0-9/]{10}) - ([0-9:]{8}): "([\s\S]*?)(?:<STEAM[\s\S]>*)?" (?:\[\d* \d* \-*\d*\]) (\w*) "([\s\S]*)" (?:\[\d* \d* \-*\d*\]) (\w+) "(\d*\w*)"#';
			$patternAchat = '#L ([0-9/]{10}) - ([0-9:]{8}): "([\s\S]*?)(?:<STEAM[\s\S]>*)?" (\w*) "(\w*\d*)"#';
			$patternConnexion = '#L ([0-9/]{10}) - ([0-9:]{8}): "([\s\S]*?)(?:<STEAM[\s\S]>*)?" (.+)#';
			preg_match("#.*#",$statInfo,$stat);
			if(preg_match("#killed#",$statInfo,$stat))
			{
			preg_match($patternKills,$statInfo,$stat);
			print_r($stat);
			}
			if(preg_match("#headshot#",$statInfo,$stat))
			{
			preg_match($patternHeadshot,$statInfo,$stat);
			print_r($stat);
			}
			elseif(preg_match("#entered the game#",$statInfo,$stat))
			{
			preg_match($patternConnexion,$statInfo,$stat);
			print_r($stat);
			}
			elseif(preg_match("#purchased#",$statInfo,$stat))
			{
			preg_match($patternAchat,$statInfo,$stat);
			print_r($stat);
			}
			echo '<br />';
		}
?>
> Cependant il me reste une petite question, maintenant que j'ai accès au programme, de façon précise, comme inscrire ces informations dans un tableau, enfin je veux dire un vrai tableau d'affichage ?
Je voudrais en faire un tableau de score qui se créer donc de façon automatique à chaque fois que je lance mon serveur, j'afficherais les tableau, classés par date, sur mon serveur :)

Mammouth du PHP | 1339 Messages

19 juil. 2014, 20:54

...

Soit tu les stockes dans une base de données.
Soit tu les stockes dans un autre fichier mais au propre avec file_put_contents : http://php.net/manual/fr/function.file-put-contents.php
Bon sinon tu me fais un message privé et on se fait un TeamViewer

sn2GhostKiller
Invité n'ayant pas de compte PHPfrance

19 juil. 2014, 22:21

Bonjour !
J'avais effectivement pensé à intégrer ces statistiques dans une base de donnée. Mais comment faire en sorte d'enregistrer les points d'un joueur dans une variable, et d'accumuler tous les points au fil de la lecture du fichier, et non pas de rajouter le même joueur à chaque point marquer, par exemple :
Au lieu d'avoir cela dans la BDD (exemple) :
Joueur Kills Deaths
A 1 1
A 1 1
A 1 1
....
Je voudrais faire en sorte d'accumuler les points comme ceci :
Joueur Kills Deaths
A 3 3
Comment pourrais-je faire ?
En prenant comme base ce code, donnez-moi juste un exemple en prenant en compte le nom d'un joueur, et les kills :
<?php
$log = file("test.log");
	foreach($log as $statInfo)
		{
			$patternHeadshot = '#L ([0-9/]{10}) - ([0-9:]{8}): "([\s\S]*?)(?:<STEAM[\s\S]>*)?" (?:\[\d* \d* \-*\d*\]) (\w*) "([\s\S]*)" (?:\[\d* \d* \-*\d*\]) (\w+) "(\d*\w*)" (\(\w*\))#';
			$patternKills = '#L ([0-9/]{10}) - ([0-9:]{8}): "([\s\S]*?)(?:<STEAM[\s\S]>*)?" (?:\[\d* \d* \-*\d*\]) (\w*) "([\s\S]*)" (?:\[\d* \d* \-*\d*\]) (\w+) "(\d*\w*)"#';
			$patternAssists = '#L ([0-9/]{10}) - ([0-9:]{8}): "([\s\S]*?)(?:<STEAM[\s\S]>*)?" (\w*\s*\S*) "([\s\S]*)"#';
			$patternAchat = '#L ([0-9/]{10}) - ([0-9:]{8}): "([\s\S]*?)(?:<STEAM[\s\S]>*)?" (\w*) "(\w*\d*)"#';
			$patternConnexion = '#L ([0-9/]{10}) - ([0-9:]{8}): "([\s\S]*?)(?:<STEAM[\s\S]>*)?" (.+)#';
			preg_match("#.*#",$statInfo,$stat);
			if(preg_match("#killed#",$statInfo,$stat))
			{
			preg_match($patternKills,$statInfo,$stat);
			print_r($stat);
			}
			if(preg_match("#headshot#",$statInfo,$stat))
			{
			preg_match($patternHeadshot,$statInfo,$stat);
			print_r($stat);
			}
			elseif(preg_match("#entered the game#",$statInfo,$stat))
			{
			preg_match($patternConnexion,$statInfo,$stat);
			print_r($stat);
			}
			elseif(preg_match("#purchased#",$statInfo,$stat))
			{
			preg_match($patternAchat,$statInfo,$stat);
			print_r($stat);
			}
			elseif(preg_match("#assisted killing#",$statInfo,$stat))
			{
			preg_match($patternAssists,$statInfo,$stat);
			print_r($stat);
			}
			echo '<br />';
		}
?>
Voici un bout du fichier .log original :
L 07/15/2014 - 19:44:03: "Eric<6><BOT><CT>" purchased "m4a1"
L 07/15/2014 - 19:44:04: "gK.sn2<2><STEAM_1:1:84443486><CT>" [1687 498 -157] killed "sn4GhostGost<12><STEAM_1:0:85317409><TERRORIST>" [1546 660 -40] with "awp"
L 07/15/2014 - 19:40:24: "gK.sn2<2><STEAM_1:1:84443486><CT>" purchased "awp"
L 07/15/2014 - 19:40:24: "gK.sn2<2><STEAM_1:1:84443486><CT>" purchased "p250"
L 07/15/2014 - 19:40:29: "sn4GhostGost<12><STEAM_1:0:85317409><>" entered the game
L 07/15/2014 - 19:44:09: "Wayne<7><BOT><TERRORIST>" assisted killing "Dave<9><BOT><CT>"
Voici ce que ça donne à l'execution :
Array ( [0] => L 07/15/2014 - 19:44:03: "Eric<6>" purchased "m4a1" [1] => 07/15/2014 [2] => 19:44:03 [3] => Eric<6> [4] => purchased [5] => m4a1 )
Array ( [0] => L 07/15/2014 - 19:44:04: "gK.sn2<2>" [1687 498 -157] killed "sn4GhostGost<12>" [1546 660 -40] with "awp" [1] => 07/15/2014 [2] => 19:44:04 [3] => gK.sn2<2> [4] => killed [5] => sn4GhostGost<12> [6] => with [7] => awp )
Array ( [0] => L 07/15/2014 - 19:40:24: "gK.sn2<2>" purchased "awp" [1] => 07/15/2014 [2] => 19:40:24 [3] => gK.sn2<2> [4] => purchased [5] => awp )
Array ( [0] => L 07/15/2014 - 19:40:24: "gK.sn2<2>" purchased "p250" [1] => 07/15/2014 [2] => 19:40:24 [3] => gK.sn2<2> [4] => purchased [5] => p250 )
Array ( [0] => L 07/15/2014 - 19:40:29: "sn4GhostGost<12><>" entered the game [1] => 07/15/2014 [2] => 19:40:29 [3] => sn4GhostGost<12><> [4] => entered the game )
Array ( [0] => L 07/15/2014 - 19:44:09: "Wayne<7>" assisted killing "Dave<9>" [1] => 07/15/2014 [2] => 19:44:09 [3] => Wayne<7> [4] => assisted killing [5] => Dave<9> )

Une petite astuce ?

Mammouth du PHP | 1339 Messages

19 juil. 2014, 22:38

Voila comment je ferais ...
Vu que jai pas tout suivi, je ne sais pas comment tu recupere le nom du mec et ses points.
$point = array();
if(array_key_exists($la_variable_du_joueur_ou_peut_importe, $point) $point[$la_variable_du_joueur_ou_peut_importe] = 0;
$point[$la_variable_du_joueur_ou_peut_importe] += $le_nombre_de_point;

print_r($point);
Bon sinon tu me fais un message privé et on se fait un TeamViewer

sn2GhostKiller
Invité n'ayant pas de compte PHPfrance

19 juil. 2014, 23:44

Salut !
C'est de cette manière que j'enregistre les noms :
<?php
$log = file("test.log");
foreach($log as $statInfo)
$patternConnexion = '#L ([0-9/]{10}) - ([0-9:]{8}): "([\s\S]*?)(?:<STEAM[\s\S\d]>*)?" (.+)#';
if(preg_match("#entered the game#",$statInfo,$stat))
{
    preg_match($patternConnexion,$statInfo,$stat);
    $joueurs = array($stat[3]);
    print_r($joueurs);
    echo '<br />';
}
De cette manière ça fonctionne, je vois les noms de chaques joueurs. Le problème est que si je fais en print_r($joueurs) en dehors du foreach... Je ne vois que le nom du dernier joueur enregistré... Après tout c'est normal, les noms des joueurs s'écrasent les uns après les autres, c'est logique que je ne vois que le nom du dernier à s'être connecté au final. Quelle méthode me proposer vous afin que je puisse enregistrer les joueurs dans un array afin d'avoir quelque chose comme ça au final :
array(
[0] = Joueur1
[1] = Joueur2
[2] = Joueur3
....) ?

Mammouth du PHP | 1339 Messages

20 juil. 2014, 00:07

Bah faut lier le joueur a ces points quoi ...
Bon sinon tu me fais un message privé et on se fait un TeamViewer

sn2GhostKiller
Invité n'ayant pas de compte PHPfrance

20 juil. 2014, 09:05

Ouai... Il faudrait que j'obtienne un tableau comme celui-ci alors :
array( (par exemple)
Victor = (accumulation de tous ces points, par exemple) 78
Samuel = 60
Bernard = 43
....)
Et ensuite les classer dans le tableau du premier au dernier (Ranger en fonction de l'ordre décroissant des points).
Comment ?

Mammouth du PHP | 1339 Messages

20 juil. 2014, 10:51

Qu'est-ce que toi tu as essayé de faire ?
Je t'ai donné la logique mais si tu n'essayes rien ...
Bon sinon tu me fais un message privé et on se fait un TeamViewer

sn2GhostKiller
Invité n'ayant pas de compte PHPfrance

20 juil. 2014, 13:04

J'ai très bien compris ce que tu as mis a ma disposition, mais il faut déjà que je trouve le moyen de récupérer les données contenu dans le fichier. C'est ce que je suis en train d'essayer de faire. Ma situation actuelle :
_ Le fichier est traité ligne par ligne.
_ Chaque ligne est décomposée différemment (par la fonction preg_match) en tenant compte de certains mots clés, par exemple, si la ligne contient "killed" alors il s'agit d'une ligne qui indique que quelqu'un marque un point, si elle contient "entered the game" elle indique qu'un joueur s'est connecté. Pour que tu comprenne bien où j'en suis, voilà le code :
<?php
$log = file("test.log");
	foreach($log as $statInfo)
		{
			$patternHeadshot = '#L ([0-9/]{10}) - ([0-9:]{8}): "([\s\S]*?)(?:<STEAM[\s\S\d]>*)?" (?:\[\-*\d* \-*\d* \-*\d*\]) (\w*) "([\s\S]*)" (?:\[\-*\d* \-*\d* \-*\d*\]) (\w+) "(\d*\w*)" (\(\w*\))#';
			$patternKills = '#L ([0-9/]{10}) - ([0-9:]{8}): "([\s\S]*?)(?:<STEAM[\s\S\d]>*)?" (?:\[\-*\d* \-*\d* \-*\d*\]) (\w*) "([\s\S]*)" (?:\[\-*\d* \-*\d* \-*\d*\]) (\w+) "(\d*\w*)"#';
			$patternAssists = '#L ([0-9/]{10}) - ([0-9:]{8}): "([\s\S]*?)(?:<STEAM[\s\S\d]>*)?" (\w*\s*\S*) "([\s\S]*)"#';
			$patternAchat = '#L ([0-9/]{10}) - ([0-9:]{8}): "([\s\S]*?)(?:<STEAM[\s\S\d]>*)?" (\w*) "(\w*\d*)"#';
			$patternConnexion = '#L ([0-9/]{10}) - ([0-9:]{8}): "([\s\S]*?)(?:<STEAM[\s\S\d]>*)?(?:<>)?" (.+)#';
			preg_match("#.*#",$statInfo,$stat);
			if(preg_match("#entered the game#",$statInfo,$stat))
			{
			preg_match($patternConnexion,$statInfo,$stat);
			print_r($stat);
			echo '<br />';
			}
			elseif(preg_match("#killed#",$statInfo,$stat))
			{
			preg_match($patternKills,$statInfo,$stat);
			print_r($stat);
			echo '<br />';
			}
			elseif(preg_match("#headshot#",$statInfo,$stat))
			{
			preg_match($patternHeadshot,$statInfo,$stat);
			print_r($stat);
			echo '<br />';
			}
			elseif(preg_match("#purchased#",$statInfo,$stat))
			{
			preg_match($patternAchat,$statInfo,$stat);
			print_r($stat);
			echo '<br />';
			}
			elseif(preg_match("#assisted killing#",$statInfo,$stat))
			{
			preg_match($patternAssists,$statInfo,$stat);
			print_r($stat);
			echo '<br />';
			}
		}
?>
Ce code permet de découper les lignes du fichier de sorte à pouvoir enregistrer plus facilement les données contenue dans le fichier, pour te faire comprendre la différence, voici une partie de fichier .log brut (original) :
L 07/15/2014 - 19:39:45: "Vladimir<11><BOT><CT>" purchased "awp"
L 07/15/2014 - 19:39:47: "Chet<4><BOT><TERRORIST>" purchased "ak47"
L 07/15/2014 - 19:39:48: "Chet<4><BOT><TERRORIST>" [650 1471 -153] killed "gK.sn2<2><STEAM_1:1:84443486><CT>" [602 1137 186] with "ak47" (headshot)
L 07/15/2014 - 19:39:49: "Dave<9><BOT><CT>" [116 851 -16] killed "Zane<10><BOT><TERRORIST>" [340 1069 49] with "m4a1"
L 07/15/2014 - 19:39:50: "gK.sn2<2><STEAM_1:1:84443486><CT>" purchased "awp"
L 07/15/2014 - 19:39:50: "gK.sn2<2><STEAM_1:1:84443486><CT>" purchased "p250"
L 07/15/2014 - 19:39:52: "Zane<10><BOT><TERRORIST>" purchased "p90"
L 07/15/2014 - 19:39:53: "Zane<10><BOT><TERRORIST>" purchased "deagle"
L 07/15/2014 - 19:40:00: "Vladimir<11><BOT><CT>" [1474 593 -159] killed "Chet<4><BOT><TERRORIST>" [1649 1194 -55] with "awp"

Et maintenant, les même lignes après avoir été traitées par le programme :
Array ( [0] => L 07/15/2014 - 19:39:45: "Vladimir<11>" purchased "awp" [1] => 07/15/2014 [2] => 19:39:45 [3] => Vladimir<11> [4] => purchased [5] => awp )
Array ( [0] => L 07/15/2014 - 19:39:47: "Chet<4>" purchased "ak47" [1] => 07/15/2014 [2] => 19:39:47 [3] => Chet<4> [4] => purchased [5] => ak47 )
Array ( [0] => L 07/15/2014 - 19:39:48: "Chet<4>" [650 1471 -153] killed "gK.sn2<2>" [602 1137 186] with "ak47" [1] => 07/15/2014 [2] => 19:39:48 [3] => Chet<4> [4] => killed [5] => gK.sn2<2> [6] => with [7] => ak47 )
Array ( [0] => L 07/15/2014 - 19:39:49: "Dave<9>" [116 851 -16] killed "Zane<10>" [340 1069 49] with "m4a1" [1] => 07/15/2014 [2] => 19:39:49 [3] => Dave<9> [4] => killed [5] => Zane<10> [6] => with [7] => m4a1 )
Array ( [0] => L 07/15/2014 - 19:39:50: "gK.sn2<2>" purchased "awp" [1] => 07/15/2014 [2] => 19:39:50 [3] => gK.sn2<2> [4] => purchased [5] => awp )
Array ( [0] => L 07/15/2014 - 19:39:50: "gK.sn2<2>" purchased "p250" [1] => 07/15/2014 [2] => 19:39:50 [3] => gK.sn2<2> [4] => purchased [5] => p250 )
Array ( [0] => L 07/15/2014 - 19:39:52: "Zane<10>" purchased "p90" [1] => 07/15/2014 [2] => 19:39:52 [3] => Zane<10> [4] => purchased [5] => p90 )
Array ( [0] => L 07/15/2014 - 19:39:53: "Zane<10>" purchased "deagle" [1] => 07/15/2014 [2] => 19:39:53 [3] => Zane<10> [4] => purchased [5] => deagle )
Array ( [0] => L 07/15/2014 - 19:40:00: "Vladimir<11>" [1474 593 -159] killed "Chet<4>" [1649 1194 -55] with "awp" [1] => 07/15/2014 [2] => 19:40:00 [3] => Vladimir<11> [4] => killed [5] => Chet<4> [6] => with [7] => awp )

Maintenant que j'ai accès à chaque type de lignes de façon individuelle, j'aimerais pouvoir faire en sorte que le programme enregistre chaque kills, morts, ... dès qu'il lit une ligne concernant l'action que je veux enregistrer dans un array (par joueurs), ou si ce n'est pas possible, dans une BDD (mais à ce moment là j'aimerais pouvoir faire en sorte qu'une table se créer automatiquement (d'après un model que j'aurais pré-enregistré) portant comme nom la date de partie, que j'extrairais du fichier .log, et mettre l'heure du début de partie (se trouvant également au début du fichier .log) en commentaire de la table).
Gros projet quand même... C'est pour cela qu'il serait préférable d'enregistrer tout cela dans un array (qui contiendrait un array par joueurs)...

Voilà, comprends-tu désormais où j'en suis ? :)
C'est aussi pour cela que je suis venu demander de l'aide, car c'est un projet assez complexe, pour moi du moins... ^^"