Мой ярлык в подобных случаях - добавить пробел в начале Канады и два пробела в начале Соединенных Штатов. Если они отображаются как опции в теге SELECT, пробелы не отображаются, но сортировка по-прежнему переносит их на передний план.
Однако в некоторых контекстах это может быть немного хакерским. В Java нужно было бы расширить StringComparator, переопределить метод compare (), создав особые случаи в США и Канаде, а затем отсортировать список (или массив), передавая новый компаратор, в качестве алгоритма сортировки.
Однако я мог бы предположить, что может быть проще просто найти соответствующие записи в массиве, удалить их из массива и снова добавить их в начале. Если вы находитесь в какой-то среде, которая будет пересортировать массив, то это может не сработать. Но в большинстве случаев это будет хорошо.
[править] Я вижу, что вы используете хеш, а не массив - поэтому это будет зависеть от того, как вы выполняете сортировку. Не могли бы вы просто поместить США в хеш с ключом -2, Канаду с -1, а затем вместо этого отсортировать по ID? Не использовав PHP в гневе в течение 11 лет, я не могу вспомнить, имеет ли он встроенную сортировку в своих хешах или вы делаете это на уровне приложения.