[PHP] Array slim uitlezen

Pagina: 1
Acties:
  • 1.202 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Ramasha
  • Registratie: September 2005
  • Laatst online: 24-01 19:28
Beste Tweakers,

Ik ben begonnen aan me eigen statisitieken script, maar loop nu al tegen een probleem op. Ik probeer om het aantal ID's te tellen in een uur (Er is een timestamp voor handen). Eerst maar eens de inhoud van $StatsHits waarin geteld moet worden.
code:
1
Array ( [id] => 13 [ip_id] => 1 [timestamp] => 2006-05-23 11:39:14 )


Ik zat zelf te denken aan een foreach loop en vervolgens een check op welk uur de hit is gemaakt, alleen zodra ik
PHP:
1
2
foreach($StatsHits as $Hit) {
}

doe krijg ik in $Hit geen ['timestamp'] etc. wat volgens mij wel hoort. Daarom vraag ik aan jullie wat jullie in mijn situatie zouden doen. Ik kan geen slimme queryies toepassen aangezien de statistieken uit een bestand worden geladen, wel is het misschien mogelijk een Temporary table te maken daar alles in te zetten en dan verwerken.

Ik zou graag van jullie horen wat ik het beste kan doen, kom er gewoon weg niet meer uit. |:(

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Die foreach zou je 3 keer moeten uitvoeren. Als je dit doet met de array die je hierboven noemt:
PHP:
1
2
3
foreach($StatsHits as $Hit) {
  echo $Hit.'<br>';
}

dan krijg je deze uitvoer:
13
1
2006-05-23 11:39:14

Ik vraag me dus af wat jij verwacht dat er moet gebeuren? Kun je wat duidelijker zijn?

Trouwens, een datum/tijd-string is geen timestamp.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 18-09 14:42
Kijk eens naar;
PHP:
1
2
3
while(list($index, $value) = each($StatsHits)) {
  echo "De waarde van '$index' is $value.<br />";
}

[ Voor 26% gewijzigd door frickY op 25-05-2006 14:37 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

frickY schreef op donderdag 25 mei 2006 @ 14:37:
Kijk eens naar;
PHP:
1
2
3
while(list($index, $value) = each($StatsHits)) {
  echo "De waarde van '$index' is $value.<br />";
}
Dat IMO slechter leesbaar dan foreach. Die list-"functie" (ik weet dat het geen functie is maar een taalelement) impliceert dat het een RValue is, maar stiekem kun je het toch als LValue gebruiken. Erg verwarrend vind ik. Dit doet hetzelfde:
PHP:
1
2
3
foreach($StatsHits as $index => $value) {
  echo "De waarde van '$index' is $value.<br />";
}

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Ramasha
  • Registratie: September 2005
  • Laatst online: 24-01 19:28
Ok om even wat duidelijkheid te scheppen:

De bedoeling is dat ik de array uitlees, kijk welk uur he hit is gemaakt. Vervolgens voeg ik aan $uur1['totaal'] er 1 aan toe, en $uur['id_ip'] om later te bekijken hoeveel unieke IP's er zijn langs gekomen.

PHP:
1
2
3
foreach($StatsHits as $index => $value) {
  echo "De waarde van '$index' is $value.<br />";
}

Werkt inderdaad, heb ik vast iets vreemds gedaan met outputten ofzo. Maar ik loop nu vast hoe kan ik controleren welk uur de Hits is geweest. Iets van een regular expresion denk ik? Zou geen idee hebben hoe het anders zou kunnen.

[ Voor 7% gewijzigd door Ramasha op 25-05-2006 15:11 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Met echte timestamps werken, en met de date-functie.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Ramasha
  • Registratie: September 2005
  • Laatst online: 24-01 19:28
-NMe- schreef op donderdag 25 mei 2006 @ 15:20:
Met echte timestamps werken, en met de date-functie.
Ik had zoiets in gedachten:

PHP:
1
2
3
4
$Time = $Hit['timestamp']; //Een echte timestamp
$Uur = date('h',$Time);
$HitsUur[$uur]=$HitsUur[$uur]+1;
$HitsIpid[$uur]=array($HitsIpid[$uur],$ip);


Alleen het enige probleem is dat met de volgende code:
PHP:
1
2
foreach($StatsHits as $index => $value) {
}


mmm jongens laat maar, zie een belangrijke fout in mijn fetch bestand waardoor ik een misvoormde array terugkrijg. Dat ga ik eerst eventjes fixen :Y)

PHP:
1
2
3
4
5
6
7
            //Tel iedere id per uur, en sla id_ip en aantal op.
            foreach($StatsHits as $Hit) {
                $Time = $Hit['timestamp']; //Een echte timestamp
                $Uur = date('H',$Time);
                $HitsUur[$Uur]=$HitsUur[$Uur]+1;
            }
        print_r($HitsIpid);

Werkt perfect, het geeft netjes Array ( [16] => 2 ) terug. Zoals je kan zien 16 is het uur en 2 is het aantal hits.
Nu wil ik ook in een aparte array $HitsIpid[$Uur] vermelden welke ip_id's er bij die hits stonden, totzover niets raars maar hoe kan ik in die array dan dubbelle ip_id's verwijderen. Aangezien je per uur meerdere hits kan hebben van 1 dezelfde IP, ik zit nu te zoeken op php.net maar kan nog weinig vinden.

[ Voor 47% gewijzigd door Ramasha op 25-05-2006 16:28 ]


Acties:
  • 0 Henk 'm!

  • PrinsEdje80
  • Registratie: Oktober 2001
  • Laatst online: 15-07 09:34

PrinsEdje80

Holographic, not grated...

Ramasha schreef op donderdag 25 mei 2006 @ 16:00:
Werkt perfect, het geeft netjes Array ( [16] => 2 ) terug. Zoals je kan zien 16 is het uur en 2 is het aantal hits.
Nu wil ik ook in een aparte array $HitsIpid[$Uur] vermelden welke ip_id's er bij die hits stonden, totzover niets raars maar hoe kan ik in die array dan dubbelle ip_id's verwijderen. Aangezien je per uur meerdere hits kan hebben van 1 dezelfde IP, ik zit nu te zoeken op php.net maar kan nog weinig vinden.
Zoek maar eens op array-unique. Dat zou het moeten doen...

Used to be Down Under... Foto gallery


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
PrinsEdje80 schreef op vrijdag 26 mei 2006 @ 05:17:
[...]

Zoek maar eens op array-unique. Dat zou het moeten doen...
Je kan je ip natuurlijk ook gewoon als key gebruiken en de value altijd op 1 zetten. Dan heb je niet nog weer extra functies nodig

PHP:
1
$HitsIpid[$Uur][$ip] = 1


Dat zou je later ook nog makkelijk aan kunnen passen zodat je telt hoe vaak een ip in een uur langs komt.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Ramasha
  • Registratie: September 2005
  • Laatst online: 24-01 19:28
rwb schreef op vrijdag 26 mei 2006 @ 09:35:
[...]


Je kan je ip natuurlijk ook gewoon als key gebruiken en de value altijd op 1 zetten. Dan heb je niet nog weer extra functies nodig

PHP:
1
$HitsIpid[$Uur][$ip] = 1


Dat zou je later ook nog makkelijk aan kunnen passen zodat je telt hoe vaak een ip in een uur langs komt.
Hoe had je dit dan in gedachten, want ik heb er nu een tijd over na gedacht maar ik kan jouw gedachtengang niet echt volgend. Zou je alsjeblieft je idee iets uitgebreider willen plaatsten?

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Gewoon, wat ie zegt. De key misbruiken. Een key moet altijd uniek zijn, dus als je wat wil wegschrijven naar $HitsIpid[12]['127.0.0.1'] en daar staat nog niks, dan maak je hem aan. Doe je dat terwijl er wel al iets staat, dan overschrijf je hem.

Echter, erg netjes vind ik dat niet. Dan liever zoiets:
PHP:
1
2
3
if (!in_array($ip, $HitsIpid[$Uur])) {
  $HitsIpid[$Uur][] = $ip;
}

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
-NMe- schreef op woensdag 31 mei 2006 @ 19:07:
Gewoon, wat ie zegt. De key misbruiken. Een key moet altijd uniek zijn, dus als je wat wil wegschrijven naar $HitsIpid[12]['127.0.0.1'] en daar staat nog niks, dan maak je hem aan. Doe je dat terwijl er wel al iets staat, dan overschrijf je hem.

Echter, erg netjes vind ik dat niet. Dan liever zoiets:
PHP:
1
2
3
if (!in_array($ip, $HitsIpid[$Uur])) {
  $HitsIpid[$Uur][] = $ip;
}
Maar op die manier kan je toch wel meerdere keren hetzelfde $ip in je array krijgen? Overigens zou ik in een andere taal iets van een Set collection gebruiken. Ik weet niet of zoiets ook bestaat in PHP

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

PHP kent AFAIK geen sets, maar je zou er kunnen maken middels een klasse. Niet dat dat hier nodig is, want voor zover ik kan zien doet deze code precies wat de topicstarter vraagt: unieke IP-adressen per uur. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Ramasha
  • Registratie: September 2005
  • Laatst online: 24-01 19:28
-NMe- schreef op woensdag 31 mei 2006 @ 20:11:
PHP kent AFAIK geen sets, maar je zou er kunnen maken middels een klasse. Niet dat dat hier nodig is, want voor zover ik kan zien doet deze code precies wat de topicstarter vraagt: unieke IP-adressen per uur. ;)
Goed begrepen :). Het is me al gelukt. Ik kwam er inderdaad ook achter dat een key maar 1x gebruik mag worden en dus niet 2 maal een ip er in kan plaatsen.

Heb alles nu werkend, jongens bedankt voor het meedenken.
Pagina: 1