Well, it's hard to explain in words, so I'll give you coding examples too. Normally I don't do that so thoroughly, but... I'm feeling nice! :p
Okay, so, what I would do, is put all of the workshops in separate SELECT boxes, but name all of the SELECT boxes the same and make them form arrays, with the key being the workshop's ID. Like so:
echo 'workshop a: <select name="workshops[' . $workshop_id1. ']">
<option value="">Select...</option>
<option value="1">First Choice</option>
<option value="2">Second Choice</option>
<option value="3">Third Choice</option>
</select><br>
workshop b: <select name="workshops[' . $workshop_id2 . ']">
<option value="">Select...</option>
<option value="1">First Choice</option>
<option value="2">Second Choice</option>
<option value="3">Third Choice</option>
</select><br>
workshop c: <select name="workshops[' . $workshop_id3 . ']">
<option value="">Select...</option>
<option value="1">First Choice</option>
<option value="2">Second Choice</option>
<option value="3">Third Choice</option>
</select>';
Now, either I'm confused or you'll have to fill in the holes, but you said you have three different workshops, correct? And I'm assuming this means these three workshops have three unique workshop ID's? I don't know why you were using $_SESSION in your code example... did they already choose a workshop? Why is that in the session already?
Basically, what you need to figure out/explain is... where do the three workshop names and ID's come from? A database? An array you have defined somewhere else?
Next, you'll get something returned like this:
Array
(
[workshops] => Array
(
[1654798] => 1
[2366821] => 3
[9945760] => 2
)
[submit] => submit
)
Now, you can use a [man]foreach/man statement to loop through the submitted "workshops" array like so:
$ranked = array();
foreach($_POST['workshops'] as $workshop_id => $rank) {
if( isset($ranked[($rank)]) || $rank == NULL) {
die('Error: You must select a unique rank for all workshops.');
} else {
$ranked[($rank)] = $workshop_id;
}
}
ksort($ranked, SORT_NUMERIC);
Note my use of [man]ksort/man to sort the $ranked array by its keys since I stored the workshop ID's such that the user's choice (first, second, third, etc.) corresponded with the key used in the array.
And that's about it. Again, I don't know where you have the array of workshop ID's and corresponding names, so you'll have to rework the code to suit your needs, but that's about how you'll be doing it.