PDA

Bekijk Volledige Versie : [PHP] while loop probleem



Jonathan
11/12/02, 23:05
Hoi,

ik heb een stukje code geschreven met een fout erin maar ik ben er nu al
uren naar aan het staren en zie niet hoe ik het kan oplossen. Misschien kan
iemand me even helpen. Het gaat om het volgende stukje code:

$timestamps = Array(); // Array that will hold timestamps to display
$twoweeks = 60*60*24*7*2; // Number of seconds in 2 weeks
$now = time(); // Current timestamp
$items_query = "SELECT timestamp FROM items ORDER BY timestamp DESC";
$items_result = mysql_query($items_query) or die("mysql error
".mysql_errno().": ".mysql_error());

while ($items_object = mysql_fetch_object($items_result))
{
$twoweeksago = $now - $twoweeks;
if (($items_object->timestamp <= $now) && ($items_object->timestamp >
$twoweeksago))
{ $timestamps[$now]++; } else { $now = $twoweeksago; }
}
while (list ($key, $val) = each ($timestamps))
{
if ($val>0)
{
echo "output";
}
}

Het gaat er hierbij om dat ik een overzicht wil echo'en naar een webpagina
die alle periodes van 2 weken laat zien waarin items voorkomen. Als er geen
items voorkomen in die 2 weken dan moet ie niks laten zien. Dus ik dacht ik
tel hoevaak er items voorkomen in een periode en zet die in een Array die ik
later doorloop met een if ($val). Probleem is nu echter als er precies 1
item voorkomt dat hij die 2 weken niet laat zien. Logisch want dan gaat het
if statement in de 1e while-loop niet op. Eigenlijk zou ik zoiets moeten
hebben als een label waarin ik kan verwijzen om naar terug te keren:

while ($items_object = mysql_fetch_object($items_result))
{
$twoweeksago = $now - $twoweeks; // hier plaats ik dan een 'label'
if (($items_object->timestamp <= $now) && ($items_object->timestamp >
$twoweeksago))
{ $timestamps[$now]++; } else { $now = $twoweeksago; // en hier een goto
'label' }
}

Volgens mij kan dat niet ik PHP en het zal wel aan een onhandige constructie
liggen, maar zoals ik al zei ik zie ff niet meer hoe ik het wel kan
oplossen.
Iemand een suggestie???????

Alvast bedankt!

Jonathan

Daniel Tryba
12/12/02, 01:40
Jonathan <jonathan@nospam-tricolon.com> wrote:
> while ($items_object = mysql_fetch_object($items_result))
> {
> $twoweeksago = $now - $twoweeks; // hier plaats ik dan een 'label'
> if (($items_object->timestamp <= $now) && ($items_object->timestamp >
> $twoweeksago))
> { $timestamps[$now]++; } else { $now = $twoweeksago; // en hier een goto
> 'label' }
> }

PHP heeft inderdaad geen goto. Soms een gemis (voor een quickhack), maar
nooit strict noodzakelijk.

> Volgens mij kan dat niet ik PHP en het zal wel aan een onhandige constructie
> liggen, maar zoals ik al zei ik zie ff niet meer hoe ik het wel kan
> oplossen.
> Iemand een suggestie???????

Het kan zijn dat ik je verkeert begrepen heb maar ik vind je code
nodeloos ingewikkeld. Je hebt namelijk mysql tot je beschiking staan,
dus waarom zou je de moeite nemen om eerst allerlei gegevens over te
halen naar PHP en daarmee te gaan rekenen, volgens mij is een redelijk
simpel alternatief, voor het vullen van het timestamps array:

<?php
$min=mysql_fetch_row(mysql_query('select min(timestamp) from items')));

for($now=time(),$timestamps=array();$now>$min[0];$now-=1209600)
{
if($n=mysql_num_rows(mysql_query("select timestamp from items where timestamp>=($now-1209600) and timestamp<$now"))>0)
{
$timestamps[$now]=$n;
}
}
?>

Niet getest maar ik neem aan dat het wel duidelijk is waar ik heen wil.

BTW Met count() kan het wellicht nog efficienter.

--

Daniel Tryba