Výpis dat ze souboru – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Výpis dat ze souboru – PHP – Fórum – Programujte.comVýpis dat ze souboru – PHP – Fórum – Programujte.com

 

Pavel
~ Anonymní uživatel
383 příspěvků
4. 2. 2018   #1
-
0
-

Ahoj, už 3 hodiny se peru s triviálním řešením ale ne a ne aby to fungovalo jak chci.

Trochu to nastínim. Potřebuju vyndat data ze souboru, soubor má data např:

[12:45:55] [connection] incoming connection: 89.103.162.80:60491 id: 0
[12:45:56] [join] HippeCZE has joined the server (0:89.103.162.80)
[12:48:20] [death] HippeCZE died 53
[12:55:29] [death] HippeCZE died 255
[12:56:26] [part] HippeCZE has left the server (0:1)
[23:27:45] [connection] 89.103.162.80:61246 requests connection cookie.
[23:27:46] [connection] incoming connection: 89.103.162.80:61246 id: 0
[23:27:47] [join] HippeCZE has joined the server (0:89.103.162.80)

a protože to nejsou data, které bych mohl organizovat ale log z herního serveru chci jednotlivý body zapsat do mysql abych s tím mohl pracovat na webu

A to zvlášť ty časy, join connection atd...

Pro přetstavu do mysql potřebuju do tabulky join zapsat hodnoty z řádku, který obsahuje join, např. takhle

Čas, Jméno, text a IP

a to samý to co obsahuje death dát do tabulky death atd... má to několik dat.

Snad chápete jak to myslím.

-------------------------------------------

function sav(){
$log = file("log.txt");

foreach($log as $txt){
    list($data) = explode("\n",$txt);
    
        $vys[] = $data;   
}

return $vys;

}

Tato funkce mi každej řádek z loglistu přidá do pole

$s = sav();   
   $txt = "[chat]";     
   foreach ($s as $value){
    if(strstr($value,$txt)){
        $data[] = $value;          
    }
}

tady vyvolávám funkci ale zobrazí mi pouze řádky, které obsahují slovo [chat]

výsledek je:

[13:15:46] [chat] [HippeCZE]: ahoj jak se máč

[13:17:21] [chat] [HippeCZE]: mam 4596$

takže to funguje jak chci, jenže teď nastává problém, chtěl jsem vytvořit další funkci abych pro každé data co chci nemusel tenhle script psát znova takže jsem udělal funkci

function log($hodnota){
    
    $data=sav();   
    foreach($data as $value){
        if(strstr($value,$hodnota)){  
            $t[] = $value;
        }       
    }   
    return $t;
}

je to vlastně uplně to samý jako kod před tím, jenže by se to mělo vyvolávat příkazem log(HODNOTA); a né přes proměnnou;

Ale nemá to žádný výsledek

Takže jsem se na to zatím kašlal a pracoval s předchozím kodem.

$count = count($data);  //tímto zjistím kolik má pole, se kterýcm chci pracovat, hodnot
    
    for($x=0;$x<$count;$x++){       
        $ar[] = $data[$x];       
    }
    

tady všechny data co obsahují slovo [chat] dám zvlášť do pole
    echo implode(" ",$ar); //tady ho vyvolám abych věděl jestli to funguje a vypíše to uplně to samý jako předtím jenže vedle sebe a ne po sebou.

No a teď z každýho toho pole chci rozdělit jednotlivý slova do pole a tím přes nějaký podmínky, nad tima jsem ale zatím nepřemýšlel odešlu do mysql.

$sub = count($ar);
    
    for($x=0;$x<$sub;$x++){
        
        $int = $ar[$x];
        
        $to[] = implode(int, " ");
        
    }

ale když chci vidět jak to dopadlo a použiju print_r výsledek je takový:

Array ( [0] => [1] => [2] => [3] => )

už sem zkusil několikrát pozměnit kod ale bud to neudělá žádný výsledek nebo to zobrazí tohle nebo vytvoří pole v poli, který je v poli.

Pokud jste alespon trochu pochopili co chci a můžete mi nějak poradit nebo alespon přiblížit, myslím si že se točím v nákym začarovanym kruhu a akorát pole co rozšifruju zase přidám do jinýho pole atd..

Jinak tohle není konečný script je to pouze script, který píšu abych zjistil jak to funguje takže v důsledku to bude vypadat uplně jinak, nicméně mi jde o to abych pochopil jak takhle věc má fugovat abych jí mohl zakomponovat do kódu.

Díky za případné komentáře

Nahlásit jako SPAM
IP: 89.103.162.–
gna
~ Anonymní uživatel
1891 příspěvků
4. 2. 2018   #2
-
0
-

Nakombinoval jsem pár věcí, co by se ti mohlo hodit. Snad ti to pomůže.

<?php
function parse($lines, $filter=[]) {
	$parsed = [];
	foreach ($lines as $line) {
			$entry = explode(' ', $line, 3);
			if (count($entry) != 3)
				continue;

			$entry = array('time' => trim($entry[0], '[]'),
				           'type' => trim($entry[1], '[]'),
				           'data' => $entry[2]);

			if (!empty($filter) && !in_array($entry['type'], $filter))
				continue;

			switch ($entry['type']) {
			case 'join':
				if (preg_match('/^(.*) has joined the server \((\d+):(.*)\)$/', $entry['data'], $match))
					$entry['join'] = array('nick' => $match[1], 'id' => $match[2], 'ip' => $match[3]);
				break;
			case 'chat':
				if (preg_match('/^\[(.*)\]: (.*)$/', $entry['data'], $match))
					$entry['chat'] = array('nick'=>$match[1], 'text'=>$match[2]);
				break;
			}

			$parsed[] = $entry;
	}
	return $parsed;
}

$lines = file("log.txt", FILE_IGNORE_NEW_LINES);
$parsed = parse($lines, ['chat']);
print_r($parsed);

foreach ($parsed as $entry) {
	echo "V {$entry['time']} {$entry['chat']['nick']} napsal: {$entry['chat']['text']}\n";
}
Array
(
    [0] => Array
        (
            [time] => 13:15:46
            [type] => chat
            [data] => [HippeCZE]: ahoj jak se máč
            [chat] => Array
                (
                    [nick] => HippeCZE
                    [text] => ahoj jak se máč
                )

        )

)
V 13:15:46 HippeCZE napsal: ahoj jak se máč
Nahlásit jako SPAM
IP: 213.211.51.–
peter
~ Anonymní uživatel
4014 příspěvků
5. 2. 2018   #3
-
0
-

Zapni si error_reporting v php, ini nebo v souboru.
$to[] = implode(int, " "); // tohle vyrobi '', protoze konstanta nebo funkce int neexistuje
$to[] = implode($int, " ");
V tom je sakra rozdil, jak se to napise.

Nahlásit jako SPAM
IP: 2001:718:2601:258:f9b3:4d...–
Pavel
~ Anonymní uživatel
383 příspěvků
5. 2. 2018   #4
-
0
-

#2 gna
díky moc, tohle už vypadá použitelně

Nahlásit jako SPAM
IP: 89.103.162.–
Pavel
~ Anonymní uživatel
383 příspěvků
5. 2. 2018   #5
-
0
-

#3 peter
díky za odpověď vůbec mě nenapadlo že se to dá napsat takhle

Nahlásit jako SPAM
IP: 89.103.162.–
Pavel
~ Anonymní uživatel
383 příspěvků
5. 2. 2018   #6
-
0
-

#5 Pavel
to byla ironie :D samozdřejmě vim že mi tam chybí dolar jen sem ho tam zapoměl napsat když se to sem psal :D

ale tím se nevyřeší problem. Kod od gna je fajn a po chvilce luštění vim jak ho autor napsal a jak s ním pracovat, takže ho trošku poupravim aby dělal uplně co chci, jinak super díky myslel jsem že se vůbec nikdo neozve

Nahlásit jako SPAM
IP: 89.103.162.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 25 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý