Jump to content

Some logic and planning help requested


gin

Recommended Posts

I'm building a scheduler, something along the lines of Google Calendar, where a user can input events and generally plan their day. One of the features I wish to add is a check for time clashing, where if two events overlap a small image alert will display.

What I currently have is like so:

1) query db and loop thru results
2) for each and every event, query db again and look for clashes
3) if there are clashes, add image to $output
4) echo $output

The actual problem is the query within a loop, which is an awful example of coding, I know. Is there some kind of... uh, funky recursive loop or something... that I can use? Any advise appreciated.

This is the actual code, if anyone's interested:
[code]
<?php
// sort of pseudo code
// Get all events happening in a day.
// For each event check if another event clashes with it, then output.

$query = "SELECT * FROM events WHERE date='$today'";
$result = mysql_query($query) or die ("Query failed: " . mysql_error());
if ($myrow = mysql_fetch_array($result)) {
do {
$this_id = $myrow['id'];
$ts = $myrow['timestart'];
$te = $myrow['timeend'];

$query2 = "SELECT id,timestart,timeend FROM events WHERE date='$today' AND id<>$this_id";
$result2 = mysql_query($query2) or die ("Query failed: " . mysql_error());
while ($myrow2 = mysql_fetch_array($result2)) {
$ts2 = $myrow['timestart'];
$te2 = $myrow['timeend'];

// if event2 starts and ends totally before or after event1, then no clash
if ( ($te2<=$ts) || ($ts2>=$te) ) {
// no clash
} else { // clash!
$clash[$j] = $myrow['id'];
$j++;
}
}
if ($j>0)
$clash = '<img src="clash.gif">';

echo $clash.' event details here'; // output event details

} while ($myrow = mysql_fetch_array($result));
}
?>
[/code]

Edit: Edited for clarity.
Link to comment
Share on other sites

Depending on the granularity of your times, you can use an associative array to record which events are at which times, like

[code=php:0]$arr['20:05'] = 'event1';
$arr['20:10'] = 'event1';[/code]


And so on.. then, if any event needs to go in an array slot that's used, you know there's a clash.  This approach requires only one pass through the events.  But if you're allowing fine-grained times, it may be cumbersome to make all the array entries.
Link to comment
Share on other sites

I'm not entirely sure what you mean by granularity but I think I get it. Users can only select times at half hour intervals, incidentally.
So one pass to create an $output array and a $clash array, then loop thru the $output array while checking with the $clash array whether to output the additional image, right?

Wow, still something of a headache, but doable now. Thank, I'll try this!
Link to comment
Share on other sites

Yep, exactly :)  I think you get what I mean by granularity.  You're using half-hour granularity, and I used 5 minutes in my example.

I use this kind of technique a lot.. instead of looping over an array multiple times, I make an associative array where the array index is exactly what I'm looking for.

If I want to check if a string is in an array (and will be doing it several times), then I do this:

[code=php:0]$arr = array(
  'string1' => true,
  'string2' => true,
....
  'string100' => true,
);

if ($arr[$test_string] === true) {
  print "Matched $test_string\n";
}[/code]

That's much faster than checking against all of 100 array entries for every string you want to check.  It only works for exact matches though.
Link to comment
Share on other sites

This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.