hide empty exposed filters
You can simply use Views Selective Filters Module for that.
Here is an introduction about this module :

This module allows to have an exposed filter only show options that belong to result set.
The options are calculated real-time with the current View's configuration, including the filters selected by the user so you get dynamic dependent filters, that is, when the value of one filter is changed, the list of options of the selective filters are updated accordingly to the trimmed down result set.