Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: PHP array laskentaa

stageradio [15.02.2010 20:38:18]

#

Hei,

Minulla on taulukko joka pitää sisällään tietoa seuraavanlaisesti:

     IP         :     AIKA
 212.3.3.3      :     1249
 212.3.3.3      :     54
 233.123.43.2   :     234
 233.123.43.2   :     2135
 ..
 ..
 .. ja niin edespäin.

Olen yrittänyt keksiä miten saan laskettua jokaisen IP osoitteen ajat yhteen. eli tässä tapauksessa 212.3.3.3:n aika olisi yhteensä 1303.

Voisitteko neuvoa miten tämä onnistuisi.

Kiitos!

temu92 [15.02.2010 20:46:16]

#

Ellei PHP:sta siihen erikseen löydy funktiota (joo löytyy kaikkee kivaa) niin ainakin tämä kelpaa korvikkeeksi:

<?php
	$ips	= array(
		array("213.3.3.3", 5000,),
		array("213.3.3.3", 52,),
		array("213.73.54.135", 1337,),
		array("213.73.54.137", 289,),
	);

	$times = array();
	foreach($ips as $info){
		list($ip, $time)	= $info;
		$times[$ip]	+= $time;
	}

	print_r($times);

trilog [15.02.2010 20:46:52]

#

Et kertonut miten sinulla se taulukko siellä PHP:ssä on, mutta esimerkiksi näin onnistuu:

<?php
$taulukko = array(
                array("212.3.3.3", 1249),
                array("212.3.3.3", 54),
                array("233.123.43.2", 234),
                array("233.123.43.2", 2135),
                 );

$yht = array();
foreach ($taulukko as $alkio) {
    if (!isset($yht[$alkio[0]]))
        $yht[$alkio[0]] = 0;

    $yht[$alkio[0]] += $alkio[1];
}

Tuolla tavalla $yht-taulukosta löytyy IP-avaimella yhteismäärä.


E: temu92 olikin nopeampi lähes identtisellä ratkaisulla.

stageradio [15.02.2010 21:00:26]

#

tosiaan nämä haetaan siis shoutcastin logista. jokainen rivi jolla joku IP lopettaa kuuntelun niin tallennetaan riviltä IP osoite ja aika taulukkoon näin:

<?php
foreach ($lines as $line_num => $line)
{
    list($first, $second, $third, $con, $action, $sec) = split('[ ]',
    if ($second == "[dest:")
    {
      $third = substr_replace($third ,"",-1);
      if ($con == "connection" && $action == "closed")
      {
        $seconds = substr_replace($sec ,"",0,1);
        $listeners['IP'] = $third;
        $listeners['time'] = $seconds;
      }
    }
}
?>

Hieman sekava taitaa olla, mutta toimii :D

Mutta mutta..
Kiitokset vastauksista.
Yritän kehitellä noista jotain :)

EDIT:

Noniin!
nyt ollaan astetta lähempänä totuutta.

<?php
foreach ($lines as $line_num => $line) {
    list($first, $second, $IP, $con, $action, $sec) = split('[ ]', htmlspecialchars($line));
    echo "Line #<b>{$line_num}</b> : " . htmlspecialchars($line) . "<br />\n";

    if ($second == "[dest:")
    {
      $IP = substr_replace($IP ,"",-1);
      echo $IP."<br />\n";
      if ($con == "connection" && $action == "closed")
      {
        $seconds = substr_replace($sec ,"",0,1);
        echo $seconds."<br />\n";
        $lisä = array($IP,$second);
        array_push($listeners, $lisä);


      }
    }
}

$yht = array();
foreach ($listeners as $alkio) {
    if (!isset($yht[$alkio[0]]))
        $yht[$alkio[0]] = 0;

    $yht[$alkio[0]] += $alkio[1];
}

print_r($yht);
?>

tulostuu hieno taulukko IP osoitteista, mutta jokaisella on 0 sekuntia aikaa.

Array ( [82.***.***.***] => 0 [91.***.***.*] => 0 ....

Osaisiko joku paikantaa vian.

Kiitos.

stageradio [15.02.2010 22:05:21]

#

Äh .. unohtakaa .. pieni kirjoitus virhe vain..

<?php
$lisä = array($IP,$second);
?>

muuttettiin

<?php
$lisä = array($IP,$seconds);
?>

niin johan lähti toimimaan.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta