The "real" solution is to re-think your database design. You should always try to avoid storing multiple data items in a single field; as when you do so you are hamstringing your DBMS's ability to select, sort, filter, and otherwise manipulate your data. What you probably need is a new table for this country info with at least 3 columns: one that relates it to the primary key of the table row with which it is associated, plus separate columns for abbreviation and name.
Anyway, if you are stuck with this data design, a somewhat shorter solution would be:
<?php
// test data:
$str = 'US,United States CA,Canada AU,Australia BR,Brazil';
?>
<select name='test'>
<?php
$arr = explode('|', preg_replace('# ([a-z]+,)#i', "|$1", $str));
foreach($arr as $country)
{
list($abbr, $name) = explode(',', $country);
printf("<option value='%s'>%s</option>\n", $abbr, $name);
}
?>
</select>